1с запрос тип субконто

Для проверки типа поля в запросе 1С 8.3 можно воспользоваться функцией языка запросов ТИПЗНАЧЕНИЯ( ).

Функция ТИП( ) получает тип по его имени. Имена примитивных типов: Число, Строка, Булево, Дата. Имена ссылочных типов строятся по следующему принципу: Документ.РеализацияТоворовУслуг или Справочник.Номенклатура.

Для полей ссылочного типа существует еще один способ проверки, используя оператор ССЫЛКА.

Статья предназначена для технических специалистов – разработчиков 1С.

Взглянув на регистры в 1С 8.3 найти в запросах на языке 1С бухгалтерии такую неочевидную сложность (по крайне мере, на релизе 1С: Предприятие 8.3.10.2561).

· Если по виртуальной таблице (в частности «Остатки») регистра бухгалтерии делать выборку без разворота по субконто, то можно получить неверный результат

Обычный активно/пассивный счет «60.4» с двумя субконто: «Организация» и «Контрагенты».

Требуется получить остаток по нему с отбором по списку контрагентов.

Казалось бы, простейший запрос нам поможет:

его результат Сумма = 12 221 544,65 . Конкретное значение суммы значения не имеет, но сразу скажу, что она неверная.

Достаточно добавить поле выборки по Субконто1 и я получаю другой результат с итоговой суммой 51 765 945,85 . И это уже правильный результат.

Но как быть, если разворот по субконто счета в 1С нам не нужен, а нужна одна итоговая сумма? Простое применение агрегатной функции не помогает:

Получаю те же неправильные: Сумма = 12 221 544,65

Чтобы получить правильный результат, пришлось в запрос добавить конструкцию, которая никак не изменяет структуру выборки, но обращается к субконто:

В результате получил искомый результат 51 765 945,85, который можно было использовать в следующих запросах пакета.

Таким образом, при построении запросов по регистрам бухгалтерии, иногда требуется использовать конструкции, которые тем или иным образом обращаются к субконто, хоть в самой выборке 1С бухгалтерия субконто и не нужно.

В свое время в платформе была ошибка — после добавления субконто к счету платформа не производила рестутуризацию существующих проводок и в результате к ним не добавлялась строка с пустым значением нового субконто.

Внешне результат данной ошибки был виден в оборотке по счету. В группировке по данному субконто появлялось две пустые строки. Если выбирать запросом в консоли одна строка была пустым значением данного типа субконто а вторая NULL.

История «лечится» перепроведением или перезаписью движений.

Приведенный ниже запрос позволяет выявить такие ошибки

ВЫБРАТЬ
Хозрасчетный.Регистратор КАК Регистратор ,
Хозрасчетный.НомерСтроки КАК НомерСтроки ,
Хозрасчетный.СчетДт КАК Счет ,
Хозрасчетный.Сумма ,
Хозрасчетный.Организация ,
ЗНАЧЕНИЕ ( ВидДвиженияБухгалтерии.Дебет ) КАК ВидДвижения ,
«Д» КАК ВидДвиженияБуквой
ПОМЕСТИТЬ Движения
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный

ВЫБРАТЬ
Хозрасчетный.Регистратор ,
Хозрасчетный.НомерСтроки ,
Хозрасчетный.СчетКт ,
Хозрасчетный.Сумма ,
Хозрасчетный.Организация ,
ЗНАЧЕНИЕ ( ВидДвиженияБухгалтерии.Кредит ),
«К»
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
;

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

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

УПОРЯДОЧИТЬ ПО
Регистратор
ИТОГИ ПО
Регистратор ,
НомерСтроки
АВТОУПОРЯДОЧИВАНИЕ

а этот кусок кода позволяет исправить ошибки в выявленных движениях

ВыборкаДокументов = РезЗапроса . Выбрать ( ОбходРезультатаЗапроса . ПоГруппировкам );
ВремяНачалаОбработки = ТекущаяДата ();
КоличествоСтрок = ВыборкаДокументов . Количество ();
НомерСтроки = 0 ;
Пока ВыборкаДокументов . Следующий () Цикл
ТекущийМоментВремени = ТекущаяДата ();
НомерСтроки = НомерСтроки + 1 ;
КоличествоСтрокОставшихся = КоличествоСтрок — НомерСтроки ;

НаборЗаписей = РегистрыБухгалтерии . Хозрасчетный . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Регистратор . Установить ( ВыборкаДокументов . Регистратор );
НаборЗаписей . Прочитать ();
НаборЗаписей . ОбменДанными . Загрузка =Истина;

ВыборкаПоСтрокам = ВыборкаДокументов . Выбрать ( ОбходРезультатаЗапроса . ПоГруппировкам );
Пока ВыборкаПоСтрокам . Следующий () Цикл
Проводка = НаборЗаписей [ ВыборкаПоСтрокам . НомерСтроки — 1 ];
Выборка = ВыборкаПоСтрокам . Выбрать ( ОбходРезультатаЗапроса . ПоГруппировкам );
Пока Выборка . Следующий () Цикл
Если Выборка . ВидДвижения = ВидДвиженияБухгалтерии . Дебет Тогда
Счет = Проводка . СчетДт ;
Субконто = Проводка . СубконтоДт ;
Иначе
Счет = Проводка . СчетКт ;
Субконто = Проводка . СубконтоКт ;
КонецЕсли;
СоответсвиеТекущихСубконто =Новый Соответствие ;
Для Каждого ВидСубконто ИЗ Счет . ВидыСубконто Цикл
СоответсвиеТекущихСубконто . Вставить ( ВидСубконто . ВидСубконто , Субконто [ ВидСубконто . ВидСубконто ]);
КонецЦикла;

Для Каждого ВидСубконто ИЗ Счет . ВидыСубконто Цикл
Субконто . Вставить ( ВидСубконто . ВидСубконто , ВидСубконто . ВидСубконто . ТипЗначения . ПривестиЗначение ());
Если СоответсвиеТекущихСубконто [ ВидСубконто . ВидСубконто ]<>Неопределено Тогда
Субконто . Вставить ( ВидСубконто . ВидСубконто , СоответсвиеТекущихСубконто [ ВидСубконто . ВидСубконто ]);
КонецЕсли;
КонецЦикла;

КонецЦикла;
КонецЦикла;
НаборЗаписей . Записать ();

СреднееВремя =( ТекущаяДата ()- ВремяНачалаОбработки )/ НомерСтроки ;
Состояние ( Строка ( НомерСтроки )+ «/» + Строка ( КоличествоСтрок )+ » (» + Строка ( ТекущаяДата ()- ТекущийМоментВремени )+ «) » + Строка ( ТекущаяДата ()+ КоличествоСтрокОставшихся * СреднееВремя ));
ОбработкаПрерыванияПользователя ();
КонецЦикла;

Перед выполением на больших базах рекомендуется отключить итоги и запрет границы редактирования.

Дополнительно,для вашего удобства, выкладываю файл .sel для консоли запроса с обработкой, который содержить оба текста.

Понравилась статья? Поделиться с друзьями:
Vkontakte.INFO
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: