В процессе работы с документами в «1С:Управление торговлей 11» (а также в ERP и «Комплексной автоматизации») часто возникает ситуация, когда одну строку с большим количеством товара необходимо разделить на несколько позиций. Например, если в документе указано «Яблоко — 2 кг», а нам требуется получить две строки по «1 кг» для отражения разных условий отгрузки, серий или просто для удобства визуального разделения. Рассмотрим подробнее, какие инструменты для этого предоставляет платформа и как реализовать этот механизм программно.
В типовых конфигурациях на базе управляемых форм предусмотрен штатный функционал для этой задачи. Нам не нужно изобретать велосипед, так как разработчики уже вывели соответствующую команду в командную панель табличных частей.
Проанализируем шаги для выполнения этой операции в интерфейсе:
Посмотрим на полезный нюанс: в некоторых релизах для вызова этого окна предусмотрено сочетание горячих клавиш Alt+F9. Это значительно ускоряет работу, если пользователю приходится обрабатывать большие накладные вручную.
Если перед нами стоит задача автоматизировать процесс (например, программно разложить 100 кг на 100 строк по 1 кг), то готового метода вроде РазбитьСтроку() у объекта табличной части нет. Выясним, как правильно реализовать это на языке 1С.
Для корректного разбиения нам необходимо использовать метод ЗаполнитьЗначенияСвойств. Это позволит гарантировать, что все аналитические разрезы (склады, счета учета, характеристики) будут перенесены в новую строку без потерь.
Разберем пример кода, который разбивает выбранную строку на единицы товара:
// Пример программного разбиения строки на единицы
Процедура РазбитьСтрокуНаЕдиницы(ТекущаяСтрока, ТабличнаяЧасть)
ОбщееКоличество = ТекущаяСтрока.Количество;
// Если количество больше 1, оставляем в текущей строке 1,
// а остальное добавляем новыми строками
Если ОбщееКоличество > 1 Тогда
// Устанавливаем количество в первой строке
ТекущаяСтрока.Количество = 1;
// Добавляем недостающие строки
Для Счетчик = 2 По ОбщееКоличество Цикл
НоваяСтрока = ТабличнаяЧасть.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекущаяСтрока);
// Важно: если есть служебные поля, их нужно обработать отдельно
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию со служебными полями. В современных конфигурациях (УТ 11, ERP) строки табличных частей связаны с другими таблицами (например, «Этапы графиков оплаты» или «Акцизы») через скрытый идентификатор КлючСвязи. Если мы просто скопируем этот ключ в новую строку, система может воспринять их как одну группу при расчете скидок или проведении. Поэтому при программном добавлении строк важно проверять, нужно ли генерировать новый КлючСвязи или копировать существующий, в зависимости от бизнес-логики задачи.
Иногда под термином «разгруппировать» понимают вывод каждой единицы товара отдельной строкой в отчете или печатной форме (например, для печати уникальных этикеток). В языке запросов 1С нет функции размножения строк, но мы можем использовать классический прием с временной таблицей чисел.
Рассмотрим, как это работает по шагам:
Число со значениями от 1 до максимально возможного количества товара (например, до 1000).ТаблицаЧисел.Число <= ТаблицаТоваров.Количество.В результате такого соединения строка с количеством «5» соединится с числами 1, 2, 3, 4 и 5, что даст нам на выходе 5 идентичных строк. Это эффективный способ «разгруппировки» данных без использования циклов в коде 1С.
Необходимо помнить о производительности системы. Как справедливо отмечалось в профессиональных обсуждениях, если в строке указано количество 100 000 (например, гайки или семена), попытка разбить это на 100 000 отдельных строк в документе приведет к критической ошибке переполнения памяти. Платформа 1С оптимизирована для работы с документами, содержащими сотни или несколько тысяч строк, но не десятки тысяч.
Выясним причину, почему так происходит: каждая строка — это отдельный объект в памяти, и при записи документа системе придется проверять каждую строку на заполнение реквизитов, рассчитывать налоги и скидки. Поэтому для очень больших количеств мерного товара лучше использовать стандартные механизмы упаковок или серий, а не физическое разбиение строк.
Резюмируем: для разовых операций используем кнопку Разбить строку (или Alt+F9), для автоматизации — цикл с ЗаполнитьЗначенияСвойств, а для формирования печатных форм или отчетов — соединение с таблицей чисел в запросе.