В процессе работы с конфигурациями 1С 8.3, в частности, с документами приема в переработку, пользователи часто сталкиваются с необходимостью доработки стандартных печатных форм. Одна из таких распространенных задач — удаление нежелательных текстовых приписок, которые автоматически добавляются системой к наименованиям номенклатуры. Рассмотрим подробнее ситуацию, когда в печатной форме Универсального передаточного документа (УПД), формируемого на основе документа Отчет давальцу 2.5, к названию выпущенной продукции автоматически добавляется фраза «Услуга по выпуску продукции "" из давальческого сырья».
Нашей целью является оставить в печатной форме только чистое наименование номенклатуры из табличной части документа. Мы разберем, как найти источник этой приписки и какие существуют подходы к решению данной проблемы, от быстрого обходного пути до наиболее надежного и рекомендуемого способа.
Когда мы формируем УПД из документа Отчет давальцу 2.5 в разделе «Прием в переработку 2.5», система автоматически подставляет в наименование продукции специфическую фразу: «Услуга по выпуску продукции "" из давальческого сырья». Для того чтобы устранить эту приписку, нам необходимо выяснить, откуда она берется. Первоначальные подозрения обычно падают на запросы, формирующие данные для печатной формы.
Наш поиск начинается с модуля менеджера документа ОтчетДавальцу2_5. В этом модуле мы находим функцию, которая отвечает за получение данных для печати, например, Функция ПолучитьДанныеДляПечати(МассивОбъектов, ПараметрыПечати) Экспорт. Внутри этой функции формируются запросы к базе данных для получения информации о шапке документа и его табличной части. Мы внимательно анализируем текст запросов, ищем любые упоминания шаблонных строк или конкатенации, которые могли бы формировать данную приписку. Однако, как правило, в запросе такого рода данных не обнаруживается.
Рассмотрим пример запроса, который может быть использован для получения данных табличной части продукции:
ВЫБРАТЬ
ТаблицаПродукции.Ссылка КАК Ссылка,
ТаблицаПродукции.НомерСтроки КАК НомерСтроки,
ТаблицаПродукции.Номенклатура КАК Номенклатура,
ТаблицаПродукции.Номенклатура.НаименованиеПолное КАК НоменклатураНаименованиеПолное,
ТаблицаПродукции.Номенклатура.Код КАК Код,
ТаблицаПродукции.Номенклатура.Артикул КАК Артикул,
ТаблицаПродукции.Характеристика КАК Характеристика,
ТаблицаПродукции.Характеристика.НаименованиеПолное КАК ХарактеристикаНаименованиеПолное,
ТаблицаПродукции.КоличествоУпаковок КАК Количество,
ВЫБОР
КОГДА ТаблицаПродукции.Упаковка <> ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
ТОГДА ТаблицаПродукции.Упаковка.НаименованиеПолное
ИНАЧЕ ТаблицаПродукции.Номенклатура.ЕдиницаИзмерения.НаименованиеПолное
КОНЕЦ КАК ЕдиницаИзмерения,
ТаблицаПродукции.Цена КАК Цена,
ТаблицаПродукции.Ссылка.СтавкаНДС КАК СтавкаНДС,
ТаблицаПродукции.Сумма КАК Сумма,
ТаблицаПродукции.СуммаНДС КАК СуммаНДС,
ТаблицаПродукции.СуммаСНДС КАК СуммаСНДС
ИЗ
Документ.ОтчетДавальцу2_5.Продукция КАК ТаблицаПродукции
ГДЕ
ТаблицаПродукции.Ссылка В (&МассивДокументов)
УПОРЯДОЧИТЬ ПО
ТаблицаПродукции.Ссылка,
ТаблицаПродукции.НомерСтроки
Как мы видим из примера, этот запрос извлекает Номенклатура.НаименованиеПолное напрямую, без каких-либо добавлений. Это означает, что приписка формируется не на уровне запроса к базе данных, а где-то позже, уже в коде 1С, который обрабатывает результаты запроса перед выводом на печать.
Когда становится очевидно, что запрос не является источником проблемы, мы расширяем область поиска. Часто такие шаблонные строки хранятся в общих модулях, которые используются для форматирования данных для различных печатных форм. Используя глобальный поиск по конфигурации по ключевой фразе «Услуга по выпуску продукции», мы можем найти место, где формируется эта строка.
В нашем случае, источник приписки был найден в общем модуле, и представляет собой шаблон строки, который затем используется для формирования полного наименования продукции. Пример такого шаблона выглядит следующим образом:
ШаблонСодержания = НСтр("ru = 'Услуга по выпуску продукции ""%1"" из давальческого сырья';
|en = 'Service to release the ""%1"" product from provided materials'");
Этот шаблон указывает, что в русском языке будет использоваться строка «Услуга по выпуску продукции ""%1"" из давальческого сырья», где %1 будет заменено на наименование конкретной продукции. Обнаружение этого шаблона является критически важным шагом, так как теперь мы точно знаем, что нужно изменить.
Поскольку прямое редактирование базовой конфигурации не является рекомендуемой практикой и может привести к проблемам при обновлении, наиболее правильным подходом к решению данной задачи является создание внешней печатной формы (ВПФ). ВПФ позволяют изменять логику формирования печатной формы, включая манипуляцию с данными, без затрагивания типовой конфигурации. Рассмотрим два основных подхода к реализации ВПФ для решения нашей проблемы.
Этот метод подходит, если вы хотите быстро получить результат и готовы к тому, что при изменениях в типовой конфигурации (например, изменении шаблона приписки) вам, возможно, потребуется повторная доработка. Суть метода заключается в том, что после того, как данные для печати будут получены, мы программно заменим нежелательную часть строки наименования номенклатуры.
Создаем Внешнюю Печатную Форму (ВПФ):
Для этого в конфигураторе создаем новую внешнюю обработку и устанавливаем ее тип как «Внешняя печатная форма». Добавляем в нее макет, который будет использоваться для печати УПД.
Переносим логику печати:
В модуле ВПФ нам потребуется перенести большую часть кода из стандартной процедуры формирования УПД. Это включает в себя вызов функции ПолучитьДанныеДляПечати (или аналогичной), которая возвращает структуру с результатами запросов.
Применяем СтрЗаменить к наименованию номенклатуры:
После получения данных (например, из РезультатПоТабличнойЧасти), мы проходим по каждой строке табличной части и модифицируем наименование продукции. Мы используем функцию СтрЗаменить для удаления найденного шаблона.
Предположим, что полное наименование продукции находится в поле Наименование.
Для Каждого СтрокаПродукции Из ДанныеДляПечати.РезультатПоТабличнойЧасти Цикл
Если Найти(СтрокаПродукции.Наименование, "Услуга по выпуску продукции """) = 1 Тогда
// Сначала удаляем левую часть приписки
СтрокаПродукции.Наименование = СтрЗаменить(СтрокаПродукции.Наименование, "Услуга по выпуску продукции """, "");
// Затем удаляем правую часть приписки (допустим, это "" из давальческого сырья")
СтрокаПродукции.Наименование = СтрЗаменить(СтрокаПродукции.Наименование, """ из давальческого сырья", "");
// В итоге останется только чистое наименование продукции
КонецЕсли;
КонецЦикла;
Важно адаптировать точную строку для замены под актуальный шаблон и убедиться, что она не затронет другие части наименования. Если шаблон может меняться, можно использовать более гибкие методы поиска и замены, например, регулярные выражения (если доступны в вашей версии 1С или через внешние компоненты).
Выводим измененные данные на макет:
После модификации данных, мы используем стандартные методы 1С для вывода их на макет печатной формы.
Преимущества этого подхода: Быстрота реализации, минимальные изменения в логике получения данных. Недостатки: Зависимость от точного шаблона строки. При изменении шаблона в типовой конфигурации потребуется повторная доработка ВПФ.
Этот подход является наиболее предпочтительным, так как он обеспечивает полную независимость ВПФ от изменений в типовой конфигурации. Вместо того чтобы полагаться на запросы и обработку данных типовой формы, мы пишем свои собственные запросы непосредственно в модуле ВПФ.
Создаем Внешнюю Печатную Форму (ВПФ):
Аналогично предыдущему пункту, создаем новую внешнюю обработку и устанавливаем ее тип как «Внешняя печатная форма». В ней мы будем работать с собственным макетом.
Разрабатываем собственные запросы:
Вместо вызова типовой функции ПолучитьДанныеДляПечати, мы создаем свои собственные объекты Новый Запрос в модуле ВПФ. Эти запросы будут напрямую обращаться к нужным таблицам базы данных, чтобы получить требуемые поля, включая чистое наименование номенклатуры.
Пример запроса для получения данных продукции без каких-либо приписок:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Продукция.Ссылка.Номер КАК НомерДокумента,
| Продукция.Ссылка.Дата КАК ДатаДокумента,
| Продукция.Номенклатура.НаименованиеПолное КАК НаименованиеПродукции,
| Продукция.КоличествоУпаковок КАК Количество,
| ВЫБОР
| КОГДА Продукция.Упаковка <> ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА Продукция.Упаковка.НаименованиеПолное
| ИНАЧЕ Продукция.Номенклатура.ЕдиницаИзмерения.НаименованиеПолное
| КОНЕЦ КАК ЕдиницаИзмерения,
| Продукция.Цена КАК Цена,
| Продукция.Сумма КАК Сумма
|ИЗ
| Документ.ОтчетДавальцу2_5.Продукция КАК Продукция
|ГДЕ
| Продукция.Ссылка В (&МассивДокументов)
|УПОРЯДОЧИТЬ ПО
| Продукция.НомерСтроки";
Запрос.УстановитьПараметр("МассивДокументов", МассивОбъектовДокументов);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Здесь МассивОбъектовДокументов — это параметр, который передается в ВПФ при ее вызове (ссылки на документы, для которых формируется печать).
Настраиваем макет ВПФ:
В макете печатной формы мы размещаем области и параметры для вывода полученных данных. Например, для вывода наименования продукции мы используем параметр НаименованиеПродукции, который напрямую берется из результата нашего запроса.
Регистрируем ВПФ в 1С:
После завершения разработки ВПФ необходимо зарегистрировать ее в пользовательском режиме 1С. Для этого переходим в раздел Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Загружаем нашу ВПФ, указываем ее назначение (например, документ ОтчетДавальцу2_5) и сохраняем.
После регистрации новая печатная форма будет доступна в меню «Печать» соответствующего документа, наряду со стандартными.
Преимущества этого подхода: Полная независимость от внутренних изменений типовой конфигурации. Вы контролируете весь процесс получения и форматирования данных. Это наиболее устойчивый к обновлениям метод. Недостатки: Требует больше времени на разработку, так как нужно самостоятельно воссоздавать логику запросов и макетов.
Помимо создания полноценных ВПФ, существуют и другие, менее масштабные, но полезные подходы:
Редактирование макета через пользовательский режим (для очень простых случаев):
Для крайне простых изменений, не связанных с логикой получения данных, можно редактировать макеты печатных форм напрямую в пользовательском режиме (Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм). Однако этот способ ограничен: можно изменить статический текст или форматирование, но нельзя удалить или изменить параметры, заключенные в квадратные скобки, и уж тем более повлиять на запросы или логику формирования данных.
Использование расширений конфигурации:
Расширения позволяют вносить изменения в типовую конфигурацию, не затрагивая ее исходные файлы. Если требуется изменить стандартный запрос или процедуру формирования печатной формы, можно создать расширение, которое переопределит соответствующий модуль или функцию. Этот метод также является рекомендуемым, но требует более глубокого понимания структуры типовой конфигурации и потенциально может быть более сложным для освоения, чем ВПФ для простых случаев.
Произвольное наименование товара:
В некоторых случаях, если вам нужно выводить не просто наименование из справочника, а произвольное наименование товара в печатных формах (счета, УПД и т.д.), можно реализовать это через добавление дополнительного реквизита в табличную часть документа. В этом реквизите пользователь будет указывать нужное наименование, которое затем будет подставляться в печатную форму через ВПФ или расширение.
Проблема с нежелательной припиской «Услуга по выпуску продукции...» в печатной форме УПД документа Отчет давальцу 2.5 является типичной задачей доработки 1С. Мы выяснили, что источник проблемы находится не в запросе к базе данных, а в общем модуле, который использует шаблон для формирования полного наименования продукции. Хотя можно использовать быстрый метод с СтрЗаменить во внешней печатной форме, наиболее правильным и устойчивым к обновлениям решением является создание полноценной внешней печатной формы со своими собственными запросами. Этот подход позволяет полностью контролировать процесс формирования данных и гарантирует, что ваша доработка не будет затронута при обновлении типовой конфигурации.
Выбор конкретного метода зависит от сложности задачи, требований к устойчивости решения и ваших навыков программирования в 1С. Для долгосрочных и критически важных доработок всегда отдавайте предпочтение созданию ВПФ с собственными запросами.