Как разбить строку в табличной части документа в 1С:Управление торговлей 11?

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

В процессе работы с документами в «1С:Управление торговлей 11» (а также в ERP и «Комплексной автоматизации») часто возникает ситуация, когда одну строку с большим количеством товара необходимо разделить на несколько позиций. Например, если в документе указано «Яблоко — 2 кг», а нам требуется получить две строки по «1 кг» для отражения разных условий отгрузки, серий или просто для удобства визуального разделения. Рассмотрим подробнее, какие инструменты для этого предоставляет платформа и как реализовать этот механизм программно.

Вариант 1. Использование стандартного интерфейсного механизма

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

Проанализируем шаги для выполнения этой операции в интерфейсе:

  1. Откроем документ (например, «Реализация товаров и услуг») и перейдем на вкладку Товары.
  2. Выделим строку, которую необходимо разделить.
  3. В командной панели над табличной частью найдем кнопку Разбить строку. Если кнопка не выведена явно, заглянем в меню Еще — команда часто скрывается именно там.
  4. В открывшемся диалоговом окне укажем количество, которое нужно «отщипнуть» от текущей строки в новую.
  5. После подтверждения система автоматически уменьшит количество в исходной строке и создаст новую строку, полностью скопировав все реквизиты (номенклатуру, цену, ставки НДС, скидки и т.д.).

Посмотрим на полезный нюанс: в некоторых релизах для вызова этого окна предусмотрено сочетание горячих клавиш Alt+F9. Это значительно ускоряет работу, если пользователю приходится обрабатывать большие накладные вручную.

Вариант 2. Программная реализация разбиения строк

Если перед нами стоит задача автоматизировать процесс (например, программно разложить 100 кг на 100 строк по 1 кг), то готового метода вроде РазбитьСтроку() у объекта табличной части нет. Выясним, как правильно реализовать это на языке 1С.

Для корректного разбиения нам необходимо использовать метод ЗаполнитьЗначенияСвойств. Это позволит гарантировать, что все аналитические разрезы (склады, счета учета, характеристики) будут перенесены в новую строку без потерь.

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


// Пример программного разбиения строки на единицы
Процедура РазбитьСтрокуНаЕдиницы(ТекущаяСтрока, ТабличнаяЧасть)
    
    ОбщееКоличество = ТекущаяСтрока.Количество;
    
    // Если количество больше 1, оставляем в текущей строке 1, 
    // а остальное добавляем новыми строками
    Если ОбщееКоличество > 1 Тогда
        
        // Устанавливаем количество в первой строке
        ТекущаяСтрока.Количество = 1;
        
        // Добавляем недостающие строки
        Для Счетчик = 2 По ОбщееКоличество Цикл
            НоваяСтрока = ТабличнаяЧасть.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекущаяСтрока);
            // Важно: если есть служебные поля, их нужно обработать отдельно
        КонецЦикла;
        
    КонецЕсли;

КонецПроцедуры

Проанализируем ситуацию со служебными полями. В современных конфигурациях (УТ 11, ERP) строки табличных частей связаны с другими таблицами (например, «Этапы графиков оплаты» или «Акцизы») через скрытый идентификатор КлючСвязи. Если мы просто скопируем этот ключ в новую строку, система может воспринять их как одну группу при расчете скидок или проведении. Поэтому при программном добавлении строк важно проверять, нужно ли генерировать новый КлючСвязи или копировать существующий, в зависимости от бизнес-логики задачи.

Вариант 3. Разгруппировка в запросах (технология «Таблица чисел»)

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

Рассмотрим, как это работает по шагам:

  1. Создаем временную таблицу, содержащую одну колонку Число со значениями от 1 до максимально возможного количества товара (например, до 1000).
  2. Соединяем нашу таблицу товаров с этой таблицей чисел.
  3. Условие соединения устанавливаем как ТаблицаЧисел.Число <= ТаблицаТоваров.Количество.

В результате такого соединения строка с количеством «5» соединится с числами 1, 2, 3, 4 и 5, что даст нам на выходе 5 идентичных строк. Это эффективный способ «разгруппировки» данных без использования циклов в коде 1С.

Ограничения и важные предупреждения

Необходимо помнить о производительности системы. Как справедливо отмечалось в профессиональных обсуждениях, если в строке указано количество 100 000 (например, гайки или семена), попытка разбить это на 100 000 отдельных строк в документе приведет к критической ошибке переполнения памяти. Платформа 1С оптимизирована для работы с документами, содержащими сотни или несколько тысяч строк, но не десятки тысяч.

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

Резюмируем: для разовых операций используем кнопку Разбить строку (или Alt+F9), для автоматизации — цикл с ЗаполнитьЗначенияСвойств, а для формирования печатных форм или отчетов — соединение с таблицей чисел в запросе.

← На главную