Как добавить серии номенклатуры из таблицы значений во внешнюю печатную форму

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

При разработке внешних печатных форм для современных конфигураций, таких как 1С:Комплексная автоматизация 2 (КА) или 1С:ERP, программисты часто сталкиваются с тем, что привычные методы работы с данными не подходят. Одной из типовых задач является вывод серий номенклатуры в регламентированные формы, например, в ТОРГ-12. Ситуация осложняется тем, что серии могут храниться в отдельных таблицах, а логика формирования самой печати скрыта глубоко в общих модулях.

В этой статье мы разберем по шагам, как найти нужный запрос, как получить таблицу значений с сериями и как правильно «склеить» эти данные для вывода в макет. Проанализируем архитектурные особенности БСП (Библиотеки стандартных подсистем), которые диктуют правила игры в современных конфигурациях.

Поиск места формирования данных для печати

Первая проблема, с которой сталкивается разработчик: в модуле объекта документа или в самой внешней обработке «нет ни одного запроса». Это происходит потому, что в КА и ERP печать реализована через Модуль менеджера документа или специализированные общие модули печати. Рассмотрим подробнее этот механизм.

Обычно во внешней печатной форме вызывается экспортный метод формирования данных. Нам необходимо найти процедуру, которая заполняет таблицу ДанныеПечати. Чаще всего в КА 2 за это отвечают функции в общих модулях типа ПечатьТорг12 или УчетНоменклатурыКлиентСервер. Если мы создаем внешнюю печатную форму на основе типовой, нам нужно перехватить формирование коллекции данных.

Выясним причину отсутствия запроса в форме. В БСП принята концепция разделения логики: запрос выполняется на сервере в модуле менеджера, формирует временные таблицы, а затем результат выгружается в структуру или таблицу значений, которая и передается в макет. Чтобы добавить серии, нам придется либо модифицировать этот запрос, либо дополнить уже готовую таблицу данных.

Получение данных о сериях номенклатуры

Предположим, вы уже написали запрос для получения серий и получили результат в виде ТаблицаЗначений. Важно понимать, что в документе Реализация товаров и услуг серии могут быть указаны в отдельной табличной части или связаны через КлючСвязиСтроки. Проанализируем структуру связи:

  1. Каждая строка номенклатуры имеет уникальный идентификатор (ключ связи).
  2. Одной строке товара может соответствовать несколько строк с разными сериями в подчиненной таблице.
  3. Для ТОРГ-12 нам нужно решить: выводить серии отдельными строками или перечислить их через запятую в одной ячейке с наименованием товара.

Рассмотрим пример кода, который подготавливает таблицу серий для последующего соединения:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   РеализацияТоваровУслугСерии.Серия КАК Серия,
    |   РеализацияТоваровУслугСерии.КлючСвязи КАК КлючСвязи
    |ИЗ
    |   Документ.РеализацияТоваровУслуг.Серии КАК РеализацияТоваровУслугСерии
    |ГДЕ
    |   РеализацияТоваровУслугСерии.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Объект.СсылкаНаОбъект);
ТаблицаСерий = Запрос.Выполнить().Выгрузить();

Объединение основной таблицы данных с таблицей серий

Теперь разберем самый важный этап: как программно «приклеить» значения из ТаблицаСерий к основной таблице, которая пойдет на печать. Допустим, основная таблица называется КоллекцияПечатныхФорм или ДанныеПечати. Нам нужно обойти её в цикле и для каждой строки найти соответствующие серии.

Посмотрим на пример реализации через метод НайтиСтроки(). Это наиболее эффективный способ работы с таблицами значений в памяти:


// Обходим основную таблицу товаров, предназначенную для вывода в макет
Для Каждого СтрокаТовара Из ДанныеПечати Цикл
    
    ПараметрыОтбора = Новый Структура("КлючСвязи", СтрокаТовара.КлючСвязи);
    НайденныеСерии = ТаблицаСерий.НайтиСтроки(ПараметрыОтбора);
    
    Если НайденныеСерии.Количество() > 0 Тогда
        МассивСерий = Новый Массив;
        Для Каждого СтрСерия Из НайденныеСерии Цикл
            МассивСерий.Добавить(Строка(СтрСерия.Серия));
        КонецЦикла;
        
        // Объединяем серии в одну строку через запятую
        ТекстСерий = СтрСоединить(МассивСерий, ", ");
        
        // Добавляем информацию о сериях к наименованию товара
        СтрокаТовара.ТоварНаименование = СтрокаТовара.ТоварНаименование + " (Серии: " + ТекстСерий + ")";
    КонецЕсли;
    
КонецЦикла;

В данном примере мы используем функцию СтрСоединить(), которая позволяет компактно вывести все серии в одну строку. Это избавляет нас от необходимости «раздувать» макет дополнительными колонками и сохраняет регламентированный вид формы ТОРГ-12.

Модификация макета внешней печатной формы

Если же ваша задача требует вывода серий в отдельную колонку, разберем, как изменить макет. В макете ТОРГ_12 найдите область Строка. Помните, что добавление новой колонки может привести к тому, что форма перестанет помещаться на лист по ширине.

Рекомендуемый алгоритм действий:

Использование механизма «ДополнитьДанныеДляПечати»

В современных версиях 1С:КА реализован механизм расширения данных. Вместо того чтобы полностью переписывать запрос, мы можем использовать процедуру-обработчик. Проанализируем ситуацию: если мы создаем внешнюю ПФ, у нас есть доступ к процедуре Печать(). Мы можем вызвать типовой метод формирования таблицы, а затем выполнить наш код по соединению с сериями.

Это делает решение «чистым»: при обновлении конфигурации логика формирования основных данных может измениться, но ваш код по добавлению серий в готовую таблицу продолжит работать, так как он зависит только от наличия КлючСвязи и поля ТоварНаименование.

Важный нюанс: при работе с сериями учитывайте политику учета серий. В некоторых случаях серия — это просто справочник, а в некоторых — это полноценный разрез учета остатков. Если политика предполагает учет по сериям только при отгрузке, убедитесь, что документ Реализация товаров и услуг уже проведен или серии в нем заполнены вручную, иначе ваш запрос вернет пустой результат.

Таким образом, мы рассмотрели комплексный подход к решению задачи. Мы выяснили, что ключ к успеху лежит не в поиске «того самого запроса» в форме, а в умении работать с коллекциями данных после их формирования типовыми механизмами конфигурации. Используя методы НайтиСтроки и СтрСоединить, можно легко дополнить любую печатную форму данными из любых связанных таблиц значений.

← На главную