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