Жёлтая тетрадь 📒 Блог о разработке в 1С 👨‍💻
1.12K subscribers
42 photos
69 links
В основном небольшие и нерегулярные личные заметки о разработке на платформе 1С:Предприятие.

@builin - по всем вопросам, вакансии и рекламу не размещаю.

Еще один мой канал: @kodbaza (осторожно, там Java)
Download Telegram
Получение измененных и удаленных данных узла плана обмена

К таблицам изменений планов обмена можно строить запросы. И если данные удалить, то в таблице изменений ссылка будет заполнена (<Объект не найден ...>), а в данных этой ссылки не будет (NULL). Пример запроса:
ВЫБРАТЬ
НоменклатураИзменения.Ссылка КАК Ссылка,
НоменклатураИзменения.Ссылка.Ссылка КАК Ссылка1
ИЗ
Справочник.Номенклатура.Изменения КАК НоменклатураИзменения
ГДЕ
НоменклатураИзменения.Узел = &Узел
//И НоменклатураИзменения.Ссылка.Ссылка ЕСТЬ NULL

Результат:
Первый - Первый
<Объект не найден> (92852:832900155d00f10711eb173504f418ec) - <NULL>
Четвертый - Четвертый

@yellow_pad | #ПланОбмена #интеграция #РегистрацияИзменений #запросы
Просмотр содержимого временных таблиц в отладке

Если остановиться в отладке после выполнения запроса и выполнить метод Запрос.ВыполнитьПакетСПромежуточнымиДанными(), получим массив с результатами всех входящих в пакет запросов (в т.ч. временных таблиц).

Для старых версий платформы можно в отладке поменять текст запроса на ВЫБРАТЬ * ИЗ {НазваниеВременнойТаблицы}. Подробнее тут.

@yellow_pad | #ВременныеТаблицы #запросы #отладка #1с
АВТОНОМЕРЗАПИСИ()

Функция языка запросов для формирования поля с уникальным, последовательно возрастающим значением (ключевое поле) во временной таблице.

Особенности:
1|Не гарантируется, что начальное значение счетчика будет равно 1 для любой временной таблицы
2|Не поддерживается в запросах, которые не формируют временную таблицу
3|Не поддерживается в запросах, содержащих ОБЪЕДИНИТЬ на верхнем уровне
4|Не поддерживается в выражениях языка запросов

Пример запроса | Подробнее на ИТС

@yellow_pad | #1С #Запросы #ЯзыкЗапросов
Вариант синтаксиса ВЫБОР в языке запросов

Можно писать ВЫБОР так:
  ВЫБОР 
КОГДА &ДанныеОтчета = 1
ТОГДА ДенежныеСредства.СуммаПриход
КОГДА &ДанныеОтчета = 2
ТОГДА ДенежныеСредства.СуммаУпрПриход
КОГДА &ДанныеОтчета = 3
ТОГДА ДенежныеСредства.СуммаРеглПриход
КОНЕЦ КАК СуммаПриход

а можно так:
ВЫБОР &ДанныеОтчета
КОГДА 1
ТОГДА ДенежныеСредства.СуммаПриход
КОГДА 2
ТОГДА ДенежныеСредства.СуммаУпрПриход
КОГДА 3
ТОГДА ДенежныеСредства.СуммаРеглПриход
КОНЕЦ КАК СуммаПриход,

@yellow_pad | #1С #Запросы #ЯзыкЗапросов1С #ВЫБОР
Совместное использование УПОРЯДОЧИТЬ ПО и РАЗЛИЧНЫЕ

В поля выборки запроса неявно включаются поля упорядочивания, автоматически. В результате конструкция РАЗЛИЧНЫЕ того же запроса может вернуть дублирующиеся строки, т.к. группировка произойдет по всем полям, в том числе по неявным.

Рекомендация ССиМ: Если в запросе используется конструкция РАЗЛИЧНЫЕ, упорядочивание следует выполнять только по полям, включенным в выборку (в секции ВЫБРАТЬ) [ссылка]

@yellow_pad | #1С #Запросы #Упорядочить #Различные
Проверка на пустой результат выполнения запроса (викторина)

Программисты 1С делятся на две категории - те, кто делают проверку РезультатЗапроса.Пустой() и те, кто не делает.

Более того, я встречал в проектах конвенции разработки, обязующие всегда выполнять проверку на Пустой() либо наоборот, запрещающие такую проверку.

Как правильно поступить в данной ситуации?

PS. естественно, полученные данные будут обрабатываться дальше по коду

@yellow_pad | #1С #Запросы #Пустой #ССиМ #Викторина
Проверка на пустой результат запроса (продолжение)

В комментариях к предыдущей записи были упоминания о рекомендациях от 1С о необходимости проверки на РезультатЗапроса.Пустой(), но ссылок так никто и не привел. Ниже ссылки на рекомендации вендора, которые я нашел. Если есть какие-то еще рекомендации вендора - поделитесь, пожалуйста, в комментариях.

ССИМ: Проверка на пустой результат выполнения запроса
п.1: Если нам не нужны данные выборки (или выгрузки) результата запроса, а нужно только проверить на наличие данных, не надо получать выборку, надо проверять на Пустой(), чтобы не загружать в память данные, которые нам не нужны.
п.2: Если мы планируем обрабатывать результат запроса - вызов метода Пустой() не требуется.

ССиМ: Оптимизация использования оперативной памяти
Приведен пример кода с проверкой на Пустой(), но сам стандарт не имеет отношения к этой проверке. Он говорит о том, что большую по объему выдачу нужно разделять на порции, чтобы не загружать в память сразу все данные. А проверка на Пустой() добавлена для прерывания бесконечного цикла, и на ней в стандарте никакого акцента нет.

Типовые конфигурации
Скриншот из предыдущего поста - из типовой конфигурации 1С:ДО. Конечно, типовые конфигурации - не эталон, но в данном примере 1С проверку на Пустой() не сделали. Это и привело меня к поискам стандартов, т.к. в проекте с сонаром требуют "обязательно проверять на Пустой()".

Моё мнение: если результат запроса пустой, то и в память при выборке будет помещено около нуля данных. Я за то, чтобы в коде было меньше лишних строк, и придерживаюсь стандарта о проверке на пустой результат. От себя добавлю, что неплохо в запросы, проверяющие наличие данных добавлять ограничение ПЕРВЫЕ 1.

PS Фрагмент
РезультатЗапроса.Пустой() = 0 я естественно пропустил с копипастой, о чем сразу написал в комментариях. Извиняюсь, вопрос был не о нём.

@yellow_pad | #1С #Запросы #Пустой #ССиМ
Для чего нужно ключевое слово АВТОУПОРЯДОЧИВАНИЕ в запросах и когда его рекомендуется использовать?

Варианты для обсуждения в комментариях...

@yellow_pad | #1С #СобесПо1С #Запросы