Хитрости при работе с 1С 8

Эта статья позволит Вам съэкономить много времени и избежать лишних усилий при решении некоторых вопросов.

Копирование текста запроса между текстом модуля и консолью запросов.

Привычное "скопировать - вставить" осложняется тем, что в модуле каждая из строчек запроса начинается с "|":

Текст запроса в модуле и в консоли запросов

Для решения этой проблемы необходимо: в модуле вызвать "Конструктор запроса" и в нем нажать кнопку "Запрос":

В открывшемся окне нажать кнопку, разрешающую редактирование текста запроса:

Редактируем текст запроса

Скопировать текст запроса - он будет без символа "|" и вставить его в консоль запросов. Копирование в обратную сторону осуществляется аналогично - копируем в консоли, вставляем в это окно.

Совмещение программной модификации текста запроса и конструктора запросов.

При создании сложных отчетов, печатных форм нередко возникает необходимость программного формирования или изменения текста запроса. Например, печать накладной по форме ТОРГ-12 из документа "Реализация товаров, услуг" в типовой конфигурации "Управление торговлей":

Программно изменяемый текст запроса - традиционный подход

При этом значение "ТоварКод" (т.е. фактически используемое поле) определяется так:

Изменение текста запроса - традиционный подход

К сожалению, конструктором запросов такой запрос не открыть. Это осложняет разработку - бывает, что текст запрос занимает несколько страниц, и поиск простой синтаксической ошибки отнимает кучу времени.

А ведь решение есть. Перепишем запрос, приведенный выше, следующим образом:

Программно изменяемый текст запроса - альтернативный подход

Параметр "ТоварКод" мы будем устанавливать вот так:

Изменение текста запроса - альтернативный подход

Результат достигнут - запрос открывается и редактируется конструктором и в то же время его текст изменяется программно.

Конструктор запросов удаляет точку с запятой в конце текста запроса

Когда часть запроса формируется текстом, а часть, программно, бывает, что текстовая вставка должна завершаться символом ";". Например:

сТекстЗапроса =
"ВЫБРАТЬ
| Ссылка,
| Код,
| Наименование
|ПОМЕСТИТЬ втВалюты
|ИЗ
| Справочник.Валюты
|;
|";
Если бКакоеТоУсловие Тогда
сТекстЗапроса = сТекстЗапроса + сДопЗапрос2;
Иначе
сТекстЗапроса = сТекстЗапроса + сДопЗапрос3;
КонецЕсли;

Однако, если такой текстовую часть открыть конструктором, то после окончания редактирования эта ";" пропадет. Так как конструктор не знает, что дальше должно идти что-то еще. И потом не понимаешь, откуда пошли ошибки.

В такой ситуации лучше написать так:

сТекстЗапроса =
"ВЫБРАТЬ
| Ссылка,
| Код,
| Наименование
|ПОМЕСТИТЬ втВалюты
|ИЗ
| Справочник.Валюты" + "
|;
|";

Обратите внимание на выделенный фрагмент.

Если бКакоеТоУсловие Тогда
сТекстЗапроса = сТекстЗапроса + сДопЗапрос2;
Иначе
сТекстЗапроса = сТекстЗапроса + сДопЗапрос3;
КонецЕсли;

Тогда открытие запроса конструктором уже ни на что не повлияет.

Разница в сортировке и при использовании агрегатных функций

При использовании полей типа "СправочникСсылка", "ДокументСсылка" в запросе, для правильной (привычной пользователю сортировки по этим полям необходимо добавлять ключевое клово "АВТОУПОРЯДОЧИВАНИЕ":

ВЫБРАТЬ
Ссылка,
Дата,
Номер
ИЗ
Документ.РеализацияТоваровУслуг
УПОРЯДОЧИТЬ ПО
Ссылка
АВТОУПОРЯДОЧИВАНИЕ

Но вот агрегатные функции (МАКСИМУМ, МИНИМУМ) такого ключевого слован не имеют и работают аналогично сортировке без "АВТОУПОРЯДОЧИВАНИЯ". Это может привести к неправильным результатам.

Допустим, что используется типовая конфигурация "Управление торговлей 8", ред. 10.2 или 10.3 и нам необходимо по каждой серии номенклатуры получить комментарий из документа "Поступление товаров услуг", которым она первый раз поступила на определенный склад. Кажется совершенно естественным написать запрос:

ВЫБРАТЬ
ТС.СерияНоменклатуры КАК Серия,
МИНИМУМ(ТС.Регистратор) КАК Регистратор
ПОМЕСТИТЬ ПриходСерий
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТС
ГДЕ
ТС.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
И ТС.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
СГРУППИРОВАТЬ ПО
ТС.СерияНоменклатуры;
////////////////////////////////////////////////////////////////////////////////////////
 
ВЫБРАТЬ
ПриходСерий.Серия,
ПТУ.Комментарий КАК Комментарий
ИЗ
ПриходСерий
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Документ.ПоступлениеТоваровУслуг КАК ПТУ
ПО ПриходСерий.Регистратор = ПТУ.Ссылка

и получить неправильный результат. Имено из-за того, что "МИНИМУМ" работает не по "АВТОУПОРЯДОЧИВАНИЮ".

Правильный запрос:

ВЫБРАТЬ
ТС.СерияНоменклатуры КАК Серия,
МИНИМУМ(ТС.Период) КАК Период
ПОМЕСТИТЬ ПриходСерийПериод
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТС
ГДЕ
ТС.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
И ТС.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
СГРУППИРОВАТЬ ПО
ТС.СерияНоменклатуры;
////////////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТС.СерияНоменклатуры КАК Серия,
МИНИМУМ(ТС.Регистратор) КАК Регистратор
ПОМЕСТИТЬ ПриходСерий
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТС
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПриходСерийДаты
ПО ТС.СерияНоменклатуры = ПриходСерийДаты.Серия
И ТС.Период = ПриходСерийДаты.Период
ГДЕ
ТС.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
И ТС.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
СГРУППИРОВАТЬ ПО
ТС.СерияНоменклатуры;
//////////////////////////////////////////////////////////////////////////////////////// 
ВЫБРАТЬ
ПриходСерий.Серия,
ПТУ.Комментарий КАК Комментарий
ИЗ
ПриходСерий
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Документ.ПоступлениеТоваровУслуг КАК ПТУ
ПО ПриходСерий.Регистратор = ПТУ.Ссылка

Теперь будет показан комментарий из "Поступления товаров услуг" с минимальной датой.

Обновлено 24.12.2011 10:54
 
home search