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