Заказы на доработку 1С (сервис удаленной работы)

Хранилище

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

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Как сделать условие по составному типу в запросе? , или ЗначениеЗаполнено() в запросе          
Vofka Подменю пользователя
сообщение 07.02.15, 19:00
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Никакого ноухау здесь изложено не будет. Просто опубликую методику, которую я недавно для себя придумал.

Итак, есть регистр накопления РН с измерением Документ регистрации, составного типа, в который входят несколько документов: Документ1, Документ2, Документ3. Так же есть какие-то документы, в табличных частях которых есть одноименный реквизит такого же типа. При проведении документов требуется выбрать строки из табличной части, в которых заполнен Документ регистрации и сделать движения по регистру РН(на самом деле пример не реальный, но суть, надеюсь, ясна).

Если у реквизита документа имеется составной тип, то значение реквизита может принимать 2 и более значений, в нашем случае значений будет 4:
  • Неопределено
  • ДокументСсылка.Документ1
  • ДокументСсылка.Документ2
  • ДокументСсылка.Документ3


Как в запросе выбрать строки из табличной части с заполненными документами регистрации?

Запрос.Текст = "
|ВЫБРАТЬ
|   *
|ИЗ
|   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
|   НЕ (РеализацияТоваровУслугТовары.ДокументРегистрации = НЕОПРЕДЕЛЕНО ИЛИ
|           РеализацияТоваровУслугТовары.ДокументРегистрации = ЗНАЧЕНИЕ(Документ.Документ1.ПустаяСсылка) ИЛИ
|           РеализацияТоваровУслугТовары.ДокументРегистрации = ЗНАЧЕНИЕ(Документ.Документ2.ПустаяСсылка) ИЛИ
|           РеализацияТоваровУслугТовары.ДокументРегистрации = ЗНАЧЕНИЕ(Документ.Документ3.ПустаяСсылка)
|        )
|";


Сейчас все хорошо. Но проблемы начинаются тогда, когда в этот составной тип добавляется ещё что-то, потому что после этого нам надо ВО ВСЕХ запросах добавить строку, в которой указать условие на пустую ссылку ново добавленного типа, т.е. первоначальный запрос примет вид:

Запрос.Текст = "
|ВЫБРАТЬ
|   *
|ИЗ
|   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
|   НЕ (РеализацияТоваровУслугТовары.ДокументРегистрации = НЕОПРЕДЕЛЕНО ИЛИ
|           РеализацияТоваровУслугТовары.ДокументРегистрации = ЗНАЧЕНИЕ(Документ.Документ1.ПустаяСсылка) ИЛИ
|           РеализацияТоваровУслугТовары.ДокументРегистрации = ЗНАЧЕНИЕ(Документ.Документ2.ПустаяСсылка) ИЛИ
|           РеализацияТоваровУслугТовары.ДокументРегистрации = ЗНАЧЕНИЕ(Документ.Документ3.ПустаяСсылка) ИЛИ
|           РеализацияТоваровУслугТовары.ДокументРегистрации = ЗНАЧЕНИЕ(Документ.Документ4.ПустаяСсылка)
|        )
|";


И так при каждой модификации нашего составного типа.

В моем случае все допустимые типы 100% будут присутствовать в измерении регистра, о котором я говорил в самом начале. Таким образом, в модуле менеджера регистра я определил функцию, которая мне возвращает массив пустых значений для данного типа:

Функция ПолучитьПустыеДокументыРегистрации() Экспорт
    
    Массив = Новый Массив;
    Массив.Добавить(Неопределено);
    Тип = Метаданные.РегистрыНакопления.РН.Измерения.ДокументРегистрации.Тип;
    Для Каждого ДокументМД ИЗ Метаданные.Документы Цикл
        ПустаяСсылка = Документы[ДокументМД.Имя].ПустаяСсылка();
        Если Тип.ПривестиЗначение(ПустаяСсылка) <> Неопределено Тогда
            Массив.Добавить(Документы[ДокументМД.Имя].ПустаяСсылка());
        КонецЕсли;
    КонецЦикла;
    Возврат Массив;
    
КонецФункции


После этого изначальный запрос можно привести к такому виду:

Запрос.УстановитьПараметр("МассивПустыхДокументов", РегистрыНакопления.РН.ПолучитьПустыеДокументыРегистрации());
Запрос.Текст = "
|ВЫБРАТЬ
|   *
|ИЗ
|   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
|   НЕ РеализацияТоваровУслугТовары.ДокументРегистрации В (&МассивПустыхДокументов)
|";


Теперь при изменении составного типа данных не надо нигде ничего менять. Только добавляем нужный тип в перечень типов в регистре - и всё.

Спасибо сказали: andr_andrey, DiegoLidabo, Егор Динин,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 15:25
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!