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