Введение
Всех приветствую, давненько я не публиковал практических статей на этом портале. В этой статье я решил затронуть такую заезженную тему как "запросы". Отмечу, что весь материал подготовлен исключительно из собственной практики за 2025 г. Он будет полезен всем желающим "набить" руку в кодинге на запросах.
В этом году столкнулись с тем, что многие компании все-таки решились на переход со своих старых версий программ 1с на современные. За основную конфигурацию для данной статьи я возьму 1С:Управление торговлей 11.5 (11.5.22.92 длительной поддержки) на 1С:Платформе 8.3.27.1688 - самой последней на начало осени 2025. Также, в описании, я затрону использование некоторых штатных составляющих Библиотеки стандартных подсистем.
Итак, переходим к описанию.
Причины написания материалы - клиенты, их базы и методы ведения учета в них
Понимая, что мы являемся официальным франчайзингом 1с, большинство клиентов приходят к нам с готовностью работать на длительную перспективу и уверенностью, что их задача будет решена. Все наши заказчики рассчитывают на индивидуальный подход к решению их задачи.
Что я вижу в "старых" базах клиентов? Не могу сказать, что совсем уж плохо все - базы разные, уровень ведения учета в базах так же разный - от "ведения на коленке" до "запредельно усложненного учета с кучей ненужных действий". Но я не видел ни одной базы, где бы учет шел без ошибок - одни исполнители поработали "так", другие - "сяк", в результате получаем то, что получаем.
Все заказчики хотят одного от "новой программы" - сохранить свое понимание работы с программой, желательно ее упростить до предела, перенести "необходимые" данные, максимально быстро начать работать на "новой программе".
Отмечу, что последнее время, мне очень понравилась конфигурация 1С:Управление торговлей 11.5 своей универсальностью, гибкостью настройки, стабильностью в работе. Считаю, что при умелом подходе ее можно настроить так, что она будет проще старой 10-ки. Поэтому, для перехода на что-то "новое" я выбираю последнее время только ее.
К чему я написал этот абзац? Да к тому, что в основном заказчик считает, что все необходимые данные для перехода в старой базе у него есть, не обращая внимание на технические тонкости работы программы, либо вообще отсутствие корректного подхода к работе в "старой" программе.
Один из примеров, есть база "под апгрейд", где напрочь отсутствует регистрация закупочных цен, они есть только в документах поступления. Заказчик хочет в "новой" программе считать маржу по факту продажи продукции. Именно поэтому, я опишу подход к составлению запросов через ключи-фильтры.
Использование ключей-фильтров для получения необходимых данных
В данной ситуации я имею старую УТ 11, в которой нет регистрации закупочных цен. Все закупочные цены можно "отловить" только документам. Мной было принято решению создать "виртуальный срез" последних закупочных цен по документам поступления от поставщиков. Сделал я это единым запросом, без использования циклов конечно.
Общий запрос выглядит вот так:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ПриобретениеТоваровУслуг.Дата, ДЕНЬ) КАК Дата,
ПриобретениеТоваровУслуг.Контрагент КАК Контрагент,
ПриобретениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ПриобретениеТоваровУслугТовары.Цена КАК Цена
ПОМЕСТИТЬ ВТ_ВесьЗакупДолго
ИЗ
Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары
ПО ПриобретениеТоваровУслуг.Ссылка = ПриобретениеТоваровУслугТовары.Ссылка
ГДЕ
ПриобретениеТоваровУслуг.Дата <= &ДатаТек
И ПриобретениеТоваровУслуг.Проведен = ИСТИНА
И ПриобретениеТоваровУслуг.Организация = &Организация
СГРУППИРОВАТЬ ПО
ПриобретениеТоваровУслуг.Дата,
ПриобретениеТоваровУслуг.Контрагент,
ПриобретениеТоваровУслугТовары.Номенклатура,
ПриобретениеТоваровУслугТовары.Цена
ИНДЕКСИРОВАТЬ ПО
Контрагент,
Номенклатура,
Дата
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МАКСИМУМ(ВТ_ВесьЗакупДолго.Дата) КАК Дата,
ВТ_ВесьЗакупДолго.Номенклатура КАК Номенклатура,
ВТ_ВесьЗакупДолго.Контрагент КАК Контрагент
ПОМЕСТИТЬ ВТ_ПакетФильтра
ИЗ
ВТ_ВесьЗакупДолго КАК ВТ_ВесьЗакупДолго
СГРУППИРОВАТЬ ПО
ВТ_ВесьЗакупДолго.Номенклатура,
ВТ_ВесьЗакупДолго.Контрагент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ПакетФильтра.Дата КАК Дата,
ВТ_ПакетФильтра.Номенклатура КАК Номенклатура,
ВТ_ПакетФильтра.Контрагент КАК Контрагент,
ВТ_ВесьЗакупДолго.Цена КАК ПоследнийЗакупЦена
ИЗ
ВТ_ПакетФильтра КАК ВТ_ПакетФильтра
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ВесьЗакупДолго КАК ВТ_ВесьЗакупДолго
ПО ВТ_ПакетФильтра.Дата = ВТ_ВесьЗакупДолго.Дата
И ВТ_ПакетФильтра.Номенклатура = ВТ_ВесьЗакупДолго.Номенклатура
И ВТ_ПакетФильтра.Контрагент = ВТ_ВесьЗакупДолго.Контрагент
СГРУППИРОВАТЬ ПО
ВТ_ПакетФильтра.Дата,
ВТ_ПакетФильтра.Номенклатура,
ВТ_ПакетФильтра.Контрагент,
ВТ_ВесьЗакупДолго.Цена
УПОРЯДОЧИТЬ ПО
Номенклатура
Код 1. Общий запрос по получению среза последних закупочных цен.
Сделаю небольшое описание:
Первым шагом, я выбираю все документы строки по документам поступлений, ограничивая себя только выбором организации и периодом поступления. Выглядит это вот так:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ПриобретениеТоваровУслуг.Дата, ДЕНЬ) КАК Дата,
ПриобретениеТоваровУслуг.Контрагент КАК Контрагент,
ПриобретениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ПриобретениеТоваровУслугТовары.Цена КАК Цена
ПОМЕСТИТЬ ВТ_ВесьЗакупДолго
ИЗ
Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары
ПО ПриобретениеТоваровУслуг.Ссылка = ПриобретениеТоваровУслугТовары.Ссылка
ГДЕ
ПриобретениеТоваровУслуг.Дата <= &ДатаТек
И ПриобретениеТоваровУслуг.Проведен = ИСТИНА
И ПриобретениеТоваровУслуг.Организация = &Организация
СГРУППИРОВАТЬ ПО
ПриобретениеТоваровУслуг.Дата,
ПриобретениеТоваровУслуг.Контрагент,
ПриобретениеТоваровУслугТовары.Номенклатура,
ПриобретениеТоваровУслугТовары.Цена
ИНДЕКСИРОВАТЬ ПО
Контрагент,
Номенклатура,
Дата
;
Код 2. Формирование запроса на основе общей таблицы (может работать долго).
Далее, я создаю некий запрос - фильтр по требуемым мной ключам, где намеренно выбираю измерения фильтрации (отбора):
ВЫБРАТЬ
МАКСИМУМ(ВТ_ВесьЗакупДолго.Дата) КАК Дата,
ВТ_ВесьЗакупДолго.Номенклатура КАК Номенклатура,
ВТ_ВесьЗакупДолго.Контрагент КАК Контрагент
ПОМЕСТИТЬ ВТ_ПакетФильтра
ИЗ
ВТ_ВесьЗакупДолго КАК ВТ_ВесьЗакупДолго
СГРУППИРОВАТЬ ПО
ВТ_ВесьЗакупДолго.Номенклатура,
ВТ_ВесьЗакупДолго.Контрагент
;
Код 3. Формирование запроса - фильтра на основе общей таблицы.
Итогом, я накладываю фильтр ключ на общую таблицу строк внутренним соединением и получаю необходимую таблицу со срезом цен на последнюю дату (см. общий запрос). А выглядит это вот так:
Рис. 1. Срез последних закупочных цен по контрагентам по документам поступления.
Далее, распоряжаюсь этой таблицей по своему усмотрению.
Использование календарей БСП для получения заданных периодов
Еще один интересный подход, который почему-то многие программисты даже с опытом не применяют и задают вопросы "а как сделать?"...
Проблема заключается в получении полного периода (по дням или месяцам) в таблицу запроса для дальнейшего использования. Мой подход такой:
Поскольку, большинство из вас работает в типовых конфигурациях или конфигурациях, которые основаны на БСП, для получения вспомогательных таблицы периодов рекомендую использовать типовые данные "производственных календарей".
Для месяцев, запрос выглядит вот так:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ДанныеПроизводственногоКалендаря.Дата, месяц) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Год = 2025
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ДанныеПроизводственногоКалендаря.Дата, месяц)
УПОРЯДОЧИТЬ ПО
Дата
Код 4. Формирование запроса - получение вспомогательной таблицы месяцев.
а для дней вот так:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ДанныеПроизводственногоКалендаря.Дата, день) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Год = 2025
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ДанныеПроизводственногоКалендаря.Дата, день)
УПОРЯДОЧИТЬ ПО
Дата
Код 5. Формирование запроса - получение вспомогательной таблицы периода по дням.
В итоге я получаю две вспомогательные таблицы, содержащие необходимые мне данные - месяц или день, которые могу применить соединением на свое усмотрение в дальнейшем. В 99% случаев это у вас сработает, без городьбы абсурда.
Заключение и выводы
В данной статье я привел два практических метода работы с запросами - использование фильтрации запросом и формирование вспомогательных таблиц необходимых периодов. Уверен, что многим будет полезны эти практики, и они будут применять эти механизмы, лежащие "на поверхности применения запросов в типовых".
Со своей стороны могу отметить, что у меня еще очень много различных методов и подходов к работе как с запросами, так и с переносом данных. Наработанными пакетами мы существенно снижаем время перехода с одной программы на другую, обеспечивая предсказуемость переноса данных.
Собственно говоря, одними переносами мы и занимаемся последнее время - не важно, "типовая или не типовая"....
Вы так же можете ознакомиться с другими полезными практическими материалами автора, как в профиле, так и ссылкам (указанных ниже).
Ну а кто меня знает - может найти другие материалы на нашем личном тг-канале.
Я надеюсь, что вам понравился данный материал. В свою очередь я могу предложить еще несколько интересных методов работы с таблицами и запросами, что существенно уменьшит вам время разработки.
Другие полезные материалы автора
Из интересных публикаций могу порекомендовать ознакомиться с этими:
Простой и быстрый перенос справочника "Номенклатура" из УТ 11.4 в Розницу 2.3
Легкий и быстрый способ переноса контрагентов и партнеров разными версиями УТ 11
Взаиморасчеты с сотрудниками - начислено, удержано и выплачено для ЗУП 3.1 [Май 2025]
Начисления, НДФЛ и взносы за период для ЗУП 3.1 [Апрель 2025]
Кадровая история сотрудников с указанием ФОТ для ЗУП 3.1 [Май 2025]
Служебная выгрузка-загрузка номенклатуры, штрихкодов, остатков, видов цен из 1С:Розницы в 1С:Розницу
Так же, в профиле есть много интересной информации о применении торгового оборудования в рамках библиотеки подключаемого оборудования.
Вступайте в нашу телеграмм-группу Инфостарт