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