В процессе работы с документами, такими как Поступление товаров или Реализация товаров и услуг, пользователи часто сталкиваются с ситуацией, когда одна и та же номенклатурная позиция добавляется в список несколько раз разными строками. Для поддержания порядка в данных и удобства работы мы разберем два основных способа решения этой задачи: «свертку при записи» и «поиск при добавлении».
Этот метод является наиболее надежным и «чистым» с точки зрения целостности данных. Его суть заключается в том, что пользователь может свободно добавлять строки в процессе работы, а программа автоматически очистит документ от дублей непосредственно перед сохранением в базу данных.
Рассмотрим реализацию данного метода по шагам:
ПередЗаписью.Свернуть для нужной табличной части.Этот подход гарантирует, что даже если пользователь допустил ошибку при ручном вводе, итоговый результат в базе данных будет корректным. Пример реализации:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Предположим, табличная часть называется Товары
// Мы сворачиваем колонку Номенклатура, суммируя данные в колонке Количество
// Если нужно учитывать характеристики или единицы измерения, укажите их через запятую
Товары.Свернуть("Номенклатура, Характеристика, Упаковка", "Количество, Сумма");
КонецПроцедуры
Преимущество этого метода: простота реализации и гарантия отсутствия дублей в базе данных. Недостаток: пользователь видит дубли в интерфейсе до тех пор, пока не нажмет кнопку «Записать».
Если вы хотите, чтобы строки объединялись сразу же после выбора товара (по аналогии с типовыми решениями для сканеров штрихкодов), необходимо использовать событийную модель формы. Для этого мы будем использовать поиск существующих строк перед добавлением новой.
Разберем логику действий:
ПриИзменении поля выбора номенклатуры.Объект.Товары.Рассмотрим пример кода для серверной процедуры, вызываемой из формы:
&НаСервере
Процедура ДобавитьТоварСервер(Номенклатура, Количество)
// Пытаемся найти строку с такой же номенклатурой
НайденнаяСтрока = Объект.Товары.Найти(Номенклатура, "Номенклатура");
Если НайденнаяСтрока <> Неопределено Тогда
// Строка найдена, просто увеличиваем количество
НайденнаяСтрока.Количество = НайденнаяСтрока.Количество + Количество;
Иначе
// Строка не найдена, добавляем новую
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = Количество;
КонецЕсли;
КонецПроцедуры
Важно помнить, что метод Свернуть доступен только на сервере. При работе в управляемых формах вы можете передавать данные с клиента на сервер, чтобы серверная процедура выполнила необходимые преобразования с объектом ДанныеФормыСтруктура или напрямую с объектом документа.
Проанализируем ситуацию: если ваш документ часто заполняется сканером штрихкодов или терминалом сбора данных, оптимальным решением будет комбинация обоих подходов. Для автоматизации работы с внешними данными от торговых площадок используется автоматическая загрузка отчётов о продажах из Excel, которая обеспечивает заполнение документов в 1С:Бухгалтерии без ручного ввода каждой строки.
ПередЗаписью как «защиту от дурака», которая сработает в любом случае, даже если пользователь нашел способ обойти интерактивную проверку.Такой комплексный подход обеспечит высокую надежность вашего программного кода и избавит пользователей от необходимости ручного удаления дублирующихся позиций в табличной части. Чтобы убедиться в отсутствии ошибок после внедрения алгоритма, применяется автоматическая сверка проводок между базами, помогающая быстро обнаружить расхождения в бухгалтерском и налоговом учёте.