Часто пользователи 1С сталкиваются с ситуацией, когда товары в экранной табличной части (где часто требуется видеть текущие остатки товаров) документа «Реализация товаров и услуг» отсортированы одним способом (например, по алфавиту или вручную), а при нажатии на кнопку печати в форме «Реализация товаров» порядок строк оказывается совершенно иным. Это вызывает путаницу при сборке товара на складе или приемке клиентом.
В этой статье мы подробно разберем (инструкция актуальна и для УПД в ERP, КА и УТ 11.5), почему штатная сортировка в документе не влияет на печать, и как с помощью программных правок добиться нужного результата в конфигурации 1С:Управление торговлей 11.5 (на базе БСП).
Проанализируем причину такого поведения системы. В современных конфигурациях на платформе 1С:Предприятие 8.3 (УТ 11, ERP, КА) печатные формы формируются не простым перебором строк из табличной части документа, который мы видим на экране. Вместо этого система выполняет сложный запрос к базе данных.
Когда вы нажимаете кнопку «Сортировать» в документе, вы меняете только визуальное представление данных в текущем сеансе или, в некоторых случаях, реквизит НомерСтроки. Однако программный код печати обращается напрямую к таблицам базы данных. Если в тексте запроса явно не указана конструкция УПОРЯДОЧИТЬ ПО, СУБД (SQL Server или PostgreSQL) возвращает данные в произвольном порядке — чаще всего в порядке физической записи строк в таблицу или по внутреннему идентификатору ссылки. Поэтому единственный надежный способ зафиксировать порядок — изменить текст запроса в модуле менеджера документа.
Для начала выясним, где именно формируются данные для печати. В документе РеализацияТоваровУслуг за вывод расходной накладной отвечает функция СформироватьПечатнуюФормуРасходнаяНакладная, расположенная в Модуле менеджера.
Рассмотрим структуру этой функции. Она содержит два основных блока формирования запроса к товарам:
ТаблицаТоваров и СуммированнаяТаблицаТоваров).Товары).Разберем ситуацию, когда серии не используются. В этом случае запрос формируется в блоке Иначе функции. Нам нужно найти текст запроса ТекстЗапросаПоТоварам и добавить в него условие сортировки. Посмотрим на пример модификации:
// Находим место перед ИТОГИ ПО
ТекстЗапросаПоТоварам = "ВЫБРАТЬ
| ... (перечисление полей) ...
| РеализацияТоваровУслугТовары.Номенклатура.НаименованиеПолное КАК ПредставлениеНоменклатуры,
| ...
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)
| ...
|УПОРЯДОЧИТЬ ПО
| ПредставлениеНоменклатуры АСЦ
|ИТОГИ ПО
| Ссылка,
| Склад,
| Номенклатура,
| Характеристика";
Важный нюанс: Конструкция УПОРЯДОЧИТЬ ПО должна обязательно стоять перед оператором ИТОГИ ПО. В качестве поля для сортировки мы используем ПредставлениеНоменклатуры, так как именно оно содержит полное наименование, которое видит пользователь в печатной форме (если не используется рабочее наименование номенклатуры).
Если на предприятии ведется учет по сериям, запрос становится пакетным. Сортировку необходимо добавить в ту часть пакета, которая делает финальную выборку из временной таблицы. Проанализируем фрагмент кода:
|ВЫБРАТЬ
| ТаблицаТоваров.Ссылка КАК Ссылка,
| ...
| ТаблицаТоваров.Номенклатура.НаименованиеПолное КАК ПредставлениеНоменклатуры,
| ...
|ИЗ
| СуммированнаяТаблицаТоваров КАК ТаблицаТоваров
|
|УПОРЯДОЧИТЬ ПО
| ПредставлениеНоменклатуры
|ИТОГИ ПО
| Ссылка,
| Склад,
| Номенклатура,
| Характеристика
Здесь мы также добавляем УПОРЯДОЧИТЬ ПО перед итогами. Это гарантирует, что при обходе результата запроса методом Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам) система будет выдавать товары в алфавитном порядке внутри каждого склада и документа.
Вносить изменения напрямую в типовую конфигурацию крайне не рекомендуется, так как это затруднит последующие обновления. Рассмотрим, как решить задачу с помощью Расширения:
РеализацияТоваровУслуг (по этой же методике добавляется факсимиле подписей ответственных лиц).СформироватьПечатнуюФормуРасходнаяНакладная из модуля менеджера.&Вместо.ТекстЗапросаПоТоварам и добавим нужную сортировку, как было показано в примерах выше.Этот метод позволит сохранить «чистоту» основной конфигурации и корректно работать при обновлениях 1С.
Выясним, какие еще варианты сортировки могут потребоваться пользователям:
ТаблицаТоваров.Номенклатура.Артикул.НомерСтроки. Однако помните, что если в печатной форме происходит «свертка» (несколько одинаковых строк документа объединяются в одну), то сортировка по номеру строки может работать некорректно.УПОРЯДОЧИТЬ ПО ПредставлениеНоменклатуры, ПредставлениеХарактеристики.Подводя итог, отметим, что редактирование печатных форм в УТ 11 требует понимания работы с объектом Запрос и механизмом пакетных запросов. Использование конструкции УПОРЯДОЧИТЬ ПО в правильном месте текста запроса — это единственный программный способ гарантировать верный порядок строк в выходном документе.