Табличная часть ~ Как получить массив строк по условию (отбору)? Для УП:
Код 1C v 8.3
&НаКлиенте
. . . .
ФМ= Новый ФиксированнаяСтруктура( "КлючСвязи" , Элементы. ДанныеБезКоррекции. ТекущиеДанные. КлючСвязи) ;
Элементы. СписокПодразделений. ОтборСтрок= ФМ;
Код 1C v 8.3
Функция ПолучитьЗаписиСогласноОтбору(ТабличноеПолеИсточник)
ОтборСтрок = ТабличноеПолеИсточник. ОтборСтрок;
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса. ИсточникДанных = Новый ОписаниеИсточникаДанных( ТабличноеПолеИсточник. Значение) ;
Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
Если ЭлементОтбора. Использование Тогда
НовыйОтбор = ПостроительЗапроса. Отбор. Добавить( ЭлементОтбора. Имя) ;
НовыйОтбор. Использование = Истина ;
НовыйОтбор. ВидСравнения = ЭлементОтбора. ВидСравнения;
НовыйОтбор. ЗначениеС = ЭлементОтбора. ЗначениеС;
НовыйОтбор. ЗначениеПо = ЭлементОтбора. ЗначениеПо;
НовыйОтбор. Значение = ЭлементОтбора. Значение;
КонецЕсли ;
КонецЦикла ;
Таблица = ПостроительЗапроса. Результат. Выгрузить( ) ;
МассивСтрок = Новый Массив;
Для Каждого Стр ИЗ Таблица Цикл
СтруктураПоиска = Новый Структура;
Для Каждого Колонка Из Таблица. Колонки Цикл
СтруктураПоиска. Вставить( Колонка. Имя, Стр[Колонка. Имя]) ;
КонецЦикла ;
НайденыеСтроки = ТабличноеПолеИсточник. Значение. НайтиСтроки( СтруктураПоиска) ;
Если НайденыеСтроки. Количество( ) > 0 Тогда
МассивСтрок. Добавить( НайденыеСтроки[0 ]) ;
КонецЕсли ;
КонецЦикла ;
Возврат МассивСтрок;
КонецФункции
Для Обычных форм:
Код 1C v 8.х ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ДокСсылка", ДанныеПоШК.Объект);
НайденныеСтроки = ПакетДокументов.НайтиСтроки(ПараметрыОтбора);
// Подробнее
СтруктураОтбора = Новый Структура("ВидДокумента, Контрагент", ПФ, ?(Контр = Неопределено, Справочники.Контрагенты.ПустаяСсылка(), Контр));
ПакетДокументов = ЗадачаОбъект.ПакетДокументов;
МассивСтрок = ПакетДокументов.НайтиСтроки(СтруктураОтбора);
Если МассивСтрок.Количество() Тогда
Для Каждого СтрокаМассива Из МассивСтрок Цикл
СтрокаМассива.ДобавленоПользователем = Истина;
СтрокаМассива.Пользователь = ПараметрыСеанса.ТекущийПользователь;
СтрокаМассива.ДатаВремя = ТекущаяДата();
КонецЦикла;
КонецЕсли;
//или
ТЧ = ПромежуточнаяНакладная.Выгрузить();
ТЧ.Свернуть("СхемаПродажи");
СтрокаСПустойСП = ТЧ.НайтиСтроки(Новый Структура("СхемаПродажи", Справочники.СхемыПродаж.ПустаяСсылка()));
Если ТЧ.Количество() - СтрокаСПустойСП.Количество() > 1 Тогда
Если Вопрос("Сбросить все схемы в строках?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
НесколькоСхем = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Для каждого СтрокаПН из ПромежуточнаяНакладная Цикл
Если СтрокаПН.Номенклатура.ВидНоменклатуры.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга Тогда
СтрокаПН.СхемаПродажи = СхемаПродажи;
КонецЕсли;
КонецЦикла;
Категория:
Работа с Формой (Диалог) и её элементами Обмен между базами через XML (создается ФабрикаXDTO) В процедурах выгрузки/загрузки создается ФабрикаXDTO из схемы, которая хранится в макете как файл. Файл настроек схемы надо использовать один и тот же в обработках Загрузки/Выгрузки
Из Фабрики создается объект, его заполняю выгружаемыми данными
Фабрику сохраняю в XML. В процедуре загрузки из читаю фабрику из XML и пробегаю по объектам
Очень удобно!
Код 1C v 8.х Функция СоздатьФайлСхемы()
ФайлСхемы = Новый Файл( КаталогВременныхФайлов( ) + "schema.xsd" ) ;
Если ФайлСхемы. Существует( ) Тогда
УдалитьФайлы( ФайлСхемы. ПолноеИмя) ;
КонецЕсли ;
Ссылка = ПолучитьМакет( "schema_xsd" ) ;
Ссылка. Записать( ФайлСхемы. ПолноеИмя) ;
Возврат ФайлСхемы. ПолноеИмя;
КонецФункции
Функция ВыгрузитьДокументы()
ФайлыXSD = Новый Массив( ) ;
ФайлыXSD. Добавить( СоздатьФайлСхемы( ) ) ;
Фабрика = СоздатьФабрикуXDTO( ФайлыXSD) ;
ФайлОбмена = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
Пока Выборка. Следующий( ) Цикл
Документ = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "Документ" ) ) ;
Документ. ID = Строка( Док. УникальныйИдентификатор( ) ) ;
Документ. ВидДокумента = Док. Метаданные( ) . Имя;
Документ. Дата = Док. Дата;
Документ. Номер = Док. Номер;
Документ. Статус = ? ( Док. Проведен, "Проведен" , ? ( Док. ПометкаУдаления, "ПометкаУдаления" , "НеПроведен" ) ) ;
Документ. Комментарий = Док. Комментарий;
КонецЦикла
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML( "UTF-8" , "1.0" , Ложь ) ;
МойXML = Новый ЗаписьXML;
МойXML. ОткрытьФайл( ИмяФайла, ПараметрыЗаписиXML) ;
МойXML. ЗаписатьОбъявлениеXML( ) ;
Фабрика. ЗаписатьXML( МойXML, ФайлОбмена) ;
МойXML. Закрыть( ) ;
ОбщегоНазначенияКлиентСервер. СообщитьПользователю( "Создан файл обмена " + ИмяФайла) ;
КонецФункции
Процедура ЗагрузитьДокументы()
ФайлыXSD = Новый Массив( ) ;
ФайлыXSD. Добавить( СоздатьФайлСхемы( ) ) ;
Фабрика = СоздатьФабрикуXDTO( ФайлыXSD) ;
ФайлОбмена = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
ОбменXML = Новый ЧтениеXML;
ОбменXML. ОткрытьФайл( ИмяФайла) ;
ФайлОбмена = Фабрика. ПрочитатьXML( ОбменXML, Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
Для Каждого Документ Из ФайлОбмена. Документ Цикл
ОбработкаПрерыванияПользователя( ) ;
Если Документ. ВидДокумента = "ПоступлениеТоваров" И
ЗначениеЗаполнено( Поставщик) И
Документ. Контрагент. ИНН Поставщик. ИНН Тогда
КонецЕсли ;
КонецЦикла
ФайлОбмена = "" ;
ОбменXML. Закрыть( ) ;
УдалитьФайлы( ИмяФайла) ;
КонецПроцедуры
Файл схемы примерно такой (разукрашка съела скобки, но смысл должен быть понятен ))
Код xs:schema xmlns:tns="http://anton.fly7.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://anton.fly7.ru" attributeFormDefault="unqualified" elementFormDefault="qualified">
xs:complexType name="ФайлОбмена">
xs:sequence>
xs:element name="Документ" type="tns:Документ" nillable="true" maxOccurs="unbounded"/>
xs:sequence>
xs:complexType>
xs:complexType name="Документ">
xs:sequence>
xs:element name="ID" type="xs:string"/>
xs:element name="ВидДокумента" type="xs:string"/>
xs:element name="Статус" type="xs:string"/>
xs:element name="Дата" type="xs:dateTime"/>
xs:element name="Номер" type="xs:string"/>
xs:element name="Контрагент" type="tns:Контрагент"/>
xs:element name="Свойства" type="tns:ТаблицаСвойства" nillable="true" minOccurs="0"/>
xs:sequence>
xs:complexType>
xs:complexType name="Контрагент">
xs:sequence>
xs:element name="ID" type="xs:string"/>
xs:element name="Наименование" type="xs:string"/>
xs:element name="ИНН" type="xs:string"/>
xs:sequence>
xs:complexType>
xs:complexType name="ТаблицаСвойства">
xs:sequence>
xs:element name="СтрокаСвойства" type="tns:СтрокаСвойство" nillable="true" maxOccurs="unbounded"/>
xs:sequence>
xs:complexType>
xs:complexType name="СтрокаСвойство">
xs:sequence>
xs:element name="Наименование" type="xs:string" nillable="true"/>
xs:element name="Значение" type="xs:string" nillable="true"/>
xs:sequence>
xs:complexType>
xs:schema>
Автор:
Абазин Антон Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Условия сравнения и проверки в Запросах. Отбор не заполненного значения Как задать отбор по Типу документа?
Как указать условие для отбора не определенного значения?
Как в языке запросов 1С отобрать не заполненное значение?
Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Код 1C v 8.х Запрос. Текст =
"ВЫБРАТЬ
| усЕдиницыХранения.Ссылка
|ИЗ
| Справочник.усЕдиницыХранения КАК усЕдиницыХранения"
|ГДЕ
| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь
|ГДЕ
| НЕ усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны
|ГДЕ
| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
|ГДЕ
| НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)
|ГДЕ
| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)
| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)
| ИЛИ ...(и т.д. - последовательно перечисляем условия для всех возможных типов этого составного поля))
|ГДЕ
| усЕдиницыХранения.Наименование > "" ""
|ГДЕ
| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор
| ВЫБОР
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА "" ПоступлениеТоваровУслуг""
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА "" РеализацияТоваровУслуг""
| ИНАЧЕ "" ""
| КОНЕЦ КАК ВидДокумента
|ГДЕ
| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО
|ГДЕ
| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
|ГДЕ ЛОЖЬ
Если НЕ Запрос. Выполнить( ) . Пустой( ) Тогда
|ГДЕ
| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)
источник Категория:
Запросы Как в журнале документов отобрать только документы "ПриемНаРаботу"? Код 1C v 8.2 УП ЭлементОтбора = ИсторияЛимитовИПорогов. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ЭлементОтбора. ЛевоеЗначение = Новый ПолеКомпоновкиДанных( "Абонент" ) ;
ЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. Равно;
ЭлементОтбора. Использование = Истина ;
ЭлементОтбора. РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных. Недоступный;
ЭлементОтбора. ПравоеЗначение = Объект. Ссылка;
Код 1C v 8.х ЖурналДокументовСписок. Отбор. ВидДокумента. Установить( Метаданные. Документы. ПриемНаРаботу) ;
Категория:
Список Справочника, Документов, Регистров Как в запросе получить Вид (тип) Документа? Столкнулся с задачей, нужно было выбрать все документы по выплате и сгруппировать их по типу документа!
Перелистав все ЖКК и интернет, понял что простого способа получить Вид документа в запросе нет
Пришлось сделать так:
Код 1C v 8.х
Запрос = Новый Запрос;
Запрос. Текст = "
|ВЫБРАТЬ
| ВЫБОР
| КОГДА ВзаиморасчетыСРаботникамиОрганизаций.Регистратор ССЫЛКА Документ.РасходныйКассовыйОрдер
| ТОГДА "" Расходный кассовый ордер""
| ИНАЧЕ ВЫБОР
| КОГДА ВзаиморасчетыСРаботникамиОрганизаций.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее
| ТОГДА "" Платежное поручение исходящее""
| ИНАЧЕ ВЫБОР
| КОГДА ВзаиморасчетыСРаботникамиОрганизаций.Регистратор ССЫЛКА Документ.ДепонированиеОрганизаций
| ТОГДА "" Депонирование""
| ИНАЧЕ ВЫБОР
| КОГДА ВзаиморасчетыСРаботникамиОрганизаций.Регистратор ССЫЛКА Документ.ПриходныйКассовыйОрдер
| ТОГДА "" Приходный кассовый ордер""
| ИНАЧЕ "" ""
| КОНЕЦ
| КОНЕЦ
| КОНЕЦ
| КОНЕЦ КАК ВидДокумента,
| ВзаиморасчетыСРаботникамиОрганизаций.Регистратор КАК Регистратор,
| ВзаиморасчетыСРаботникамиОрганизаций.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
|ГДЕ
| ВзаиморасчетыСРаботникамиОрганизаций.Регистратор.Дата МЕЖДУ &ДатаН И &ДатаК
| И ВзаиморасчетыСРаботникамиОрганизаций.ВидДвижения = &ВидДвижения
|ИТОГИ
| СУММА(СуммаВзаиморасчетов)
|ПО
| ВидДокумента
|" ;
Запрос. УстановитьПараметр( "ВидДвижения" , ВидДвиженияНакопления. Расход) ;
Запрос. УстановитьПараметр( "ДатаК" , Дата( "28.02.2010 23:59:59" ) ) ;
Запрос. УстановитьПараметр( "ДатаН" , Дата( "01.02.2010 0:00:00" ) ) ;
Результат = Запрос. Выполнить( ) ;
Результат = Результат. Выбрать( ) ;
Пока Результат. Следующий( ) Цикл
КонецЦикла ;
В 8.2.какой-то версии добавили определение ТИПА
Код 1C v 8.х ГДЕ ТИПЗНАЧЕНИЯ( Регистратор) = ТИП( Документ. ВидДокумента)
Категория:
Запросы