Использование выборки в 1С 8 3 и 8 2

Запросы в 1С

Запросы предназначены для извлечения и обработки информации из базы данных для предоставления пользователю в требуемом виде. Под обработкой здесь подразумевается группировка полей, сортировка строк, расчет итогов и т.д. Изменять данные с помощью запросов в 1С нельзя!

Запрос выполняется в соответствии с заданными инструкциями — текстом запроса. Текст запроса составляется в соответствии с синтаксисом и правилами языка запросов. Язык запросов 1С:Предприятие 8 основан на базе стандартного SQL, но имеет некоторые отличия и расширения.

Схема работы с запросом

Общая схема работы с запросом состоит из нескольких последовательных этапов:

  1. Создание объекта Запрос и установка текста запроса;
  2. Установка параметров запроса;
  3. Выполнение запроса и получение результата;
  4. Обход результата запроса и обработка полученных данных.

1. Объект Запрос имеет свойство Текст, которому необходимо присвоить текст запроса.

// Вариант 1
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта» ;

// Вариант 2
Запрос = Новый Запрос ( «ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта» );

2. Установка значений параметров осуществляется методом УстановитьПараметр (< Имя >, < Значение >) . Параметры в тексте запроса обозначаются символом «&» и обычно используются в условиях отбора (секция ГДЕ) и в параметрах виртуальных таблиц.

Запрос . УстановитьПараметр ( «Валюта» , ВыбраннаяВалюта );

3. После присвоения текста и установки параметров запрос необходимо выполнить и получить результат выполнения. Выполнение производится методом Выполнить () , который возвращает объект РезультатЗапроса. Из результата запроса можно:

  • получить выборку с помощью метода Выбрать (< ТипОбхода >, < Группировки >, < ГруппировкиДляЗначенийГруппировок >) ;
  • выгрузить значения в таблицу значений или дерево значений с помощью метода Выгрузить (< ТипОбхода >) .

// Получение выборки
РезультатЗапроса = Запрос . Выполнить ();
Выборка = РезультатЗапроса . Выбрать ();

// Получение таблицы значений
РезультатЗапроса = Запрос . Выполнить ();
Таблица = РезультатЗапроса . Выгрузить ();

4. Обойти выборку результата запроса можно с помощью цикла:

Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Курс );
КонецЦикла;

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

// Этап 1. Создание запроса и установка текста запроса
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта» ;

// Этап 2. Установка параметров
Запрос . УстановитьПараметр ( «Валюта» , ВыбраннаяВалюта );

// Этап 3. Выполнение запроса и получение выборки
РезультатЗапроса = Запрос . Выполнить ();
Выборка = РезультатЗапроса . Выбрать ();

// Обход выборки
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Курс );
КонецЦикла;

Состав текста запроса

Текст запроса состоит из нескольких секций:

  1. Описание запроса — перечень выбираемых полей и источников данных;
  2. Объединение запросов — выражения «ОБЪЕДИНИТЬ» и «ОБЪЕДИНИТЬ ВСЕ»;
  3. Упорядочивание результатов — выражение «УПОРЯДОЧИТЬ ПО …»;
  4. Автоупорядочивание — выражение «АВТОУПОРЯДОЧИВАНИЕ»;
  5. Описание итогов — выражение «ИТОГИ … ПО …».

Обязательной является только первая секция.

Временные таблицы и пакетные запросы

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

Часто можно столкнуться с ситуацией, когда в качестве источника запроса нужно использовать не таблицы базы данных, а результат выполнения другого запроса. Эту задачу можно решить с помощью вложенных запросов или временных таблиц. Применение временных таблиц позволяет упростить текст сложного запроса, разделив его на составные части, а также, в некоторых случаях, ускорить выполнение запроса и уменьшить количество блокировок. Для работы с временными таблицами используется объект МенеджерВременныхТаблиц. Создание временной таблицы производится при помощи ключевого слова ПОМЕСТИТЬ, за которым следует наименование временной таблицы.

МенеджерВТ = Новый МенеджерВременныхТаблиц ;
Запрос = Новый Запрос ;
Запрос . МенеджерВременныхТаблиц = МенеджерВТ ;

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

РезультатЗапроса = Запрос . Выполнить ();

Для использования временной таблицы ВТВалюты в других запросах необходимо этим запросам присвоить общий менеджер временных таблиц — МенеджерВТ.

Пакетный запрос — это запрос, в котором содержится несколько запросов, разделенных символом «;». При выполнении пакетного запроса все входящие в него запросы выполняются последовательно, причем результаты всех временных таблиц доступны всем последующим запросам. Явное присвоение менеджера временных таблиц пакетным запросам не обязательно. Если менеджер временных таблиц не присвоен, то все временные таблицы удалятся сразу после выполнения запроса.

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

// Пример работы с пакетным запросом
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| Валюты.Наименование
|ИЗ
| Справочник.Валюты КАК Валюты
|;
|ВЫБРАТЬ
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура» ;

РезультатПакета = Запрос . ВыполнитьПакет ();

ТЗВалюты = РезультатПакета [ 0 ]. Выгрузить ();
ТЗНоменклатура = РезультатПакета [ 1 ]. Выгрузить ();

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

Запрос . УстановитьПараметр ( «Производитель» , Производитель );

РезультатЗапроса = Запрос . Выполнить ();
Выборка = РезультатЗапроса . Выбрать ();

Пока Выборка . Следующий () Цикл

КонецЦикла;

Виртуальные таблицы

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

Существуют следующие виртуальные таблицы (в скобках указаны возможные параметры):

  • Для регистров сведений:
    • СрезПервых(<Период>, <Условие>) — наиболее ранние записи на указанную дату;
    • СрезПоследних(<Период>, <Условие>) — наиболее поздние записи на указанную дату;
    • Остатки(<Период>, <Условие>) — остатки на указанную дату;
    • Обороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) — обороты за период;
    • ОстаткиИОбороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) — остатки и обороты за период;
    • Остатки(<Период>, <УсловиеСчета>, <Субконто>, <Условие>) — остатки на указанную дату в разрезе счета, измерений и субконто;
    • Обороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) — обороты за период в разрезе счета, измерений, кор. счета, субконто, кор. субконто;
    • ОстатковИОборотов(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) — остатки и оборотов в разрезе счета, измерений и субконто;
    • ОборотыДтКт(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) — обороты за период в разрезе счета Дт, счета Кт, Субконто Дт, Субконто Кт;
    • ДвиженияССубконто(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) — движения вместе со значениями субконто;
    • База(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) — базовые данные регистра расчета;
    • ДанныеГрафика(<Условие>) — данные графика;
    • ФактическийПериодДействия(<Условие>) — фактический период действия.

    При работе с виртуальными таблицами следует накладывать отборы в параметрах виртуальных таблиц, а не в условии ГДЕ. От этого сильно зависит время выполнения запроса.

    Конструктор запроса

    Для ускорения ввода текстов запросов платформа имеет специальные инструменты: Конструктор запроса и Конструктор запроса с обработкой результата. Для вызова конструкторов необходимо щелкнуть правой кнопкой мыши и выбрать требуемый пункт:

    Вызов конструктора запроса

    Также конструкторы можно вызвать из главного меню Текст.

    При помощи конструктора запроса программист может интерактивно сконструировать текст запроса. Для этого мышкой выбираются нужные таблицы и поля, устанавливаются связи, группировки, итоги и т.д. Данный подход позволяет экономить время и избавиться от возможных ошибок. В результате своей работы конструктор запроса формирует текст запроса.

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

    Конструктор запроса 1С

    Объект СхемаЗапроса

    Платформа позволяет программно создавать и редактировать текст запроса при помощи объекта СхемаЗапроса. Объект имеет единственное свойство ПакетЗапросов, в котором объекта хранятся свойства всех запросов, редактируемых в данный момент. Объект СхемаЗапроса поддерживает следующие методы:

    • УстановитьТекстЗапроса (< Текст >) — заполняет свойство ПакетЗапросов на основании переданного текста запроса;
    • ПолучитьТекстЗапроса () — возвращает сформированный на основании свойства ПакетЗапросов текст запроса;

    Рассмотрим пример работы с объектом СхемаЗапроса. Для программного формирования текста запроса

    ВЫБРАТЬ
    Валюты.Ссылка КАК Валюта,
    Валюты.Код
    ИЗ
    Справочник.Валюты КАК Валюты
    ГДЕ
    НЕ Валюты.ПометкаУдаления

    УПОРЯДОЧИТЬ ПО
    Валюты.Код

    Код на встроенном языке может выглядеть так:

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

    Остались вопросы?
    Спросите в комментариях к статье.

    Источник

    

    Общая схема выполнения запросов

    Запросы в системе «1С:Предприятие 8» предназначены для выборки информации из базы данных. По сути, запрос — это обращение к системе с просьбой выбрать определенную информацию из базы данных, а часто не только выбрать, но и произвести некоторую обработку: сгруппировать, отсортировать, вычислить. Например, с помощью запроса можно легко узнать объем продаж каждого товара в течение года с детализацией до месяца или выбрать элементы справочников по определенному условию. Заметьте, что изменять данные с помощью запросов в 1С:Предприятии не разрешается.

    Язык запросов 1С:Предприятия 8 основан на стандартном SQL, но при этом содержит значительное количество расширений, ориентированных на финансово-экономические задачи, и значительно облегчает разработку бизнес-приложений.

    Для работы с запросами в системе «1С:Предприятие 8» предусмотрено несколько специальных объектов, а именно:

    • Запрос
    • РезультатЗапроса
    • ВыборкаИзРезультатаЗапроса.

    Общая схема выполнения запроса такова:

    1. Создание объекта «Запрос» с нужным текстом запроса на специальном языке запросов.
    2. Установка параметров запроса с помощью метода УстановитьПараметр.
    3. Выполнение запроса, получение результата.
    4. Получение выборки из результата запроса или выгрузка результата в таблицу значений / дерево значений. Также есть возможность использовать результат запроса для формирования сводной таблицы.
    5. Обработка выборки или таблицы значений (например, перебор строк) и выполнение действий, для которых был нужен запрос, например, вывод области при формировании отчета

    Графически это можно представить следующим образом:

    Цифрами на схеме обозначены следующие действия:

    1. Установка текста запроса

    Объект «Запрос» имеет свойство «Текст», которое содержит строку с текстом запроса на языке запросов. Этому свойству, во-первых, можно явно присвоить значение или, во-вторых, воспользоваться конструктором объекта «Запрос». В последнем случае текст запроса передается в качестве параметра в конструктор объекта «Запрос» при его создании.

    1-й вариант:

    Копировать в буфер обмена

    2-й вариант (с другим текстом запроса):

    Копировать в буфер обмена

    2. Установка параметров запроса

    Объект «Запрос» имеет метод «УстановитьПараметр», с помощью которого в запрос передаются значения параметров. Параметры запроса обычно используются в условиях отбора (конструкции ГДЕ, ИМЕЮЩИЕ) или в качестве параметров вызова виртуальных таблиц. В тексте запроса параметры обозначаются знаком «&» (например, параметр «ВыбГруппа» в первом запросе).

    В качестве параметров используются значения, которые указываются пользователем в диалоге или значения типов, для которых нет литералов, например, пустых ссылок на элементы справочников. Литералы же есть только у примитивных типов данных, а именно, число, строка, дата, булево, Null, Неопределено.

    3. Выполнение запроса

    После присвоения текста и установки параметров, запрос запускается на выполнение с помощью метода «Выполнить()» объекта «Запрос». Этот метод возвращает другой объект «РезультатЗапроса», содержащий выбранные данные из базы данных.

    Копировать в буфер обмена

    Далее возможны три варианта:

    • во-первых, из результата запроса может быть получена выборка (линейная, иерархическая и т.д.),
    • во-вторых, результат запроса может быть выгружен в таблицу или дерево значений,
    • в-третьих, результат запроса может являться источником данных для сводной таблицы.

    4. Получение выборки из результата запроса

    Объект «РезультатЗапроса» имеет метод «Выбрать()», который возвращает новый объект «ВыборкаИзРезультатаЗапроса». В зависимости от параметра <ТипОбхода> метода «Выбрать()» выборка будет линейной (по умолчанию), иерархической или по группировкам. Далее выборка обходится с помощью цикла «Пока Выборка.Следующий() Цикл», а в теле цикла производятся какие-то действия, например, вывод областей в табличный документ.

    Копировать в буфер обмена

    5. Выгрузка результата запроса в таблицу или дерево значений

    Объект «РезультатЗапроса» имеет метод «Выгрузить()», который возвращает таблицу значений или дерево значений, в зависимости от переданного параметра <Тип обхода>. Если устанавливается прямой тип обхода (по умолчанию), то будет создана таблица значений, иначе — дерево значений. Далее таблица значений (дерево значений) может быть обработана средствами встроенного языка или показана пользователю в табличном поле.

    6. Формирование сводной таблицы

    Результат запроса может быть использован как источник данных для сводной таблицы. При этом итоги (см. предложение ИТОГИ в тексте запроса) становятся ресурсами (отображаются в области данных), а группировочные поля, по которым они подсчитываются, становятся измерениями сводной таблицы. В качестве источника данных для сводной таблицы может быть также использован объект «ПостроительОтчета», но ему на вход тоже подается запрос, поэтому можно сказать, что основа любой сводной таблицы — это запрос к базе данных.

    Источник

    Использование выборки в 1С 8.3 и 8.2

    Выборка в 1С 8.2 и 8.3- специализированный способ перебора записей таблиц информационной базы. Рассмотрим подробно, что такое выборка и как её использовать.

    выборка в выборке

    Что такое выборка в 1С?

    Выборка — способ перебора информации в 1С, который заключается в последовательной установки курсора на последующей записи. Выборку в 1С можно получить из результата запроса и из менеджера объектов , например, документов или справочников.

    Пример получения и перебора из менеджера объекта:

    Пример получения выборки из запроса:

    Оба перечисленных выше примера получают одинаковые наборы данных для перебора.

    Методы Выборки 1С 8.3

    Выборка имеет большое количество методов, рассмотрим их подробней:

    • Выбрать() — метод, с помощью которого получают непосредственно выборку. Из выборки можно получить еще одну, подчиненную, выборку если указан тип обхода «по группировкам».
    • Владелец() — метод, обратный Выбрать(). Позволяет получить «родительскую» выборка запроса.
    • Следующий() — метод, производящий перевод курсора на следующую запись. Если запись существует, возвращает Истина, если записи закончились — Ложь.
    • НайтиСледующий() — очень полезный метод, с помощью которого можно выполнять перебор только нужных поле по значению отбора (отбор — структура полей).
    • СледующийПоЗначениюПоля() — позволяет получить следующую запись с отличным от текущего положения значения. Например, необходимо перебрать все записи с уникальный значением поля «Контрагент»: Выборка.СледующийПоЗначениюПоля(«Контрагент»).
    • Сбросить() — позволяет сбросить текущее расположение курсора и установить его в первоначальное положение.
    • Количество() — возвращает количество записей в выборке.
    • Получить() — с помощью метода можно можно установить курсор на нужной записи по значению индекса.
    • Уровень() — уровень в иерархии текущей записи (число).
    • ТипЗаписи() — отображает тип записи — ДетальнаяЗапись, ИтогПоГруппировке, ИтогПоИерархии или ОбщийИтог
    • Группировка() — возвращает имя текущей группировки, если запись не является группировкой — пустую строку.

    Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

    Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания — попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
    Попробуйте бесплатно по ссылке >>

    К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

    Источник

    [ Разбор вопросов ] Про методы Следующий и СледующийПоЗначениюПоля, а также про команду Движения.ИмяРегистра.Записывать = Истина при проведении по “новой” методике

    Сегодня в подборке всего два вопроса. Главное их сходство – это глубина и полнота полученных ответов от тренеров в Мастер-группах. Мы даже не сомневаемся, что первый слушатель уяснил, в чем разница между методами Следующий и СледующийПоЗначениюПоля, а второй – разобрался, почему нельзя использовать последовательность команд Движения.ИмяРегистра.Записывать = Истина и Движения.ИмяРегистра.Записать() при проведении документа по “новой” методике.

    Вопрос №1: В чем разница методов навигации по записям результата запроса Следующий и СледующийПоЗначениюПоля?

    Ответ

    В общем случае эти методы могут давать разные результаты. Поэтому отметим разницу между методами Следующий и СледующийПоЗначениюПоля:

    1. При помощи метода Следующий происходит позиционирование на следующей записи из результата запроса.
    2. При помощи метода СледующийПоЗначениюПоля выборка позиционируется на следующую запись со значением, отличающимся от текущего значения, по указанному полю.
    3. Могут использоваться вложенные циклы, работающие с одной и той же выборкой:

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

    Теперь рассмотрим на примере. Пусть у нас есть следующие данные:

    Данные

    Данные из базы выбираем при помощи такого кода:

    Сделаем 4 варианта обработки этой выборки:

    Выводит номера строк – 1, 2, 3, 4, 5, 6. Т.е. обходит последовательно все строки исходной таблицы.

    Выводит номер строки – 1, потому что в таблице используется только один товар во всех строках, значит, получается только одна итерация цикла.

    Внешний цикл. Номер строки – 1

    Внутренний цикл. Номер строки – 1

    Почему именно так? Потому что данный фрагмент кода работает следующим образом:

    1. Во внешнем цикле вызвали метод Выборка.СледующийПоЗначениюПоля(“Товар”) – спозиционировались на первой строке. Затем выполнение кода переходит во вложенный цикл – по покупателям.
    2. Вызвали во вложенном цикле метод Выборка.СледующийПоЗначениюПоля(“Покупатель”) – спозиционировались на первом покупателе (Иванов) для текущего товара (Стол). Это тоже первая строка таблицы.

    Поэтому и внешний, и внутренний цикл выводят первую строку таблицы.

    Оба цикла завершают свою работу, поскольку все товары во всех строках одинаковы, а также все покупатели во всех строках одинаковы. Больше итераций циклов не будет.

    Внешний цикл. Номер строки – 1

    Внутренний цикл. Номер строки – 1

    Внутренний цикл. Номер строки – 2

    Внутренний цикл. Номер строки – 3

    Внутренний цикл. Номер строки – 4

    Внутренний цикл. Номер строки – 5

    Внутренний цикл. Номер строки – 6

    Внешний цикл выполняется только один раз, поскольку во всех строках таблицы один и тот же товар. А внутренний цикл выполняется 6 раз, обходит все строки таблицы.

    Таким образом, нужно просто представлять, как будет работать метод Следующий или СледующийПоЗначениюПоля. И в зависимости от задачи выбирать тот, что подходит для решения задачи.

    Вопрос №2: В каких случаях на экзамене 1С:Специалист по платформе 8.3 нужно использовать команду Движения.Записать() и/или команду Движения.ИмяРН.Записать()?

    Получил результат экзамена 1C:Специалист по платформе 8.3. Не сдал 🙁 Одна из ошибок сформулирована следующим образом: “ При предварительной записи используется метод Движения.ОстаткиНоменклатуры.Записать() (он не сбрасывает флаг Записывать=Истина) ”.

    Не могли бы вы подробно рассказать в каких случаях нужно использовать Движения.Записать(), а в каких Движения.ИмяРН.Записать()?

    У меня после контроля остатков (по новой методике) было еще списание себестоимости по другому РН (по старой методике). К заполнению второго регистра претензий нет. Остатки контролировались, себестоимость рассчитывалась правильно. Я так понимаю претензия в том, что набор по первому регистру записывается дважды, сначала при Движения.РН.Записать(), а потом еще раз при окончании проведения.

    Ответ

    Если в Вашем решении сначала свойство Записывать набора записей регистра было установлено в значение “Истина”, а затем использовался метод Записать() набора записей регистра, то есть была такая последовательность команд:

    то значением свойства Движения.ИмяРегистра.Записывать после этой последовательности команд останется по прежнему значение “Истина“. И в конце обработки проведения набор записей этого регистра действительно будет записан еще раз.

    Для “старой” методики такая ситуация вполне нормальна: первая операция записи (явная, Движения.ИмяРегистра.Записать()) удаляет из базы прежние движения документа, записывая пустой набор (актуально при перепроведении). Вторая операция записи (неявная, в конце обработки проведения, на основании значения Движения.ИмяРегистра.Записывать = Истина) записывает в базу новые, сформированные этим документом движения.

    Если же в процессе формирования движений будет выставлен признак отмены проведения (Отказ = Истина), то явно устанавливать значение свойства Движения.ИмяРегистра.Записывать в значение “Ложь” не требуется, так как при этом сама транзакция записи будет отменена, и повторной (в данном случае лишней) записи набора в базу данных не произойдет.

    Если же указанная выше последовательность команд

    использовалась при проведении по “новой” методике, то, скорее всего, здесь и была допущена ошибка.

    При “новой” методике предварительное удаление существующих движений не требуется, набор записей регистра записывается один раз – перед контролем остатков. И если запись производилась так, как показано выше, то система действительно выполнит лишнюю запись в базу данных при окончании проведения (т.к. значение свойства Движения.ИмяРегистра.Записывать осталось в значении “Истина”). В этом случае претензия экзаменатора вполне обоснована.

    Источник

    1C:Enterprise

    Основные приемы работы с запросами во встроенном языке 1С:Предприятия удобнее всего рассматривать на примерах. Приведем типичный пример использования запроса:

    // Выполним запрос и запишем результат в переменную РезультатЗапроса.
    РезультатЗапроса = Запрос . Выполнить ( ) ;

    // Получим выборку из результата запроса.
    Выборка = РезультатЗапроса . Выбрать ( ) ;

    Как видно из этого примера, работа с запросом ведется при помощи трех основных объектов:

    • Запрос – объект, выполняющий сам запрос. Представлен в примере переменной с именем Запрос.
    • РезультатЗапроса – объект, содержащий полученные при выполнении запроса данные. Представлен в примере переменной с именем РезультатЗапроса. – объект, позволяющий обходить (т.е. перебрать) записи из результата. Представлен в примере переменной с именем Выборка.

    Рассмотрим подробнее объект ВыборкаИзРезультатаЗапроса. Для этого нам понадобится следующий текст запроса:

    ВЫБРАТЬ
    Товар, Количество
    ИЗ
    Документ.РасхНакл.Состав
    УПОРЯДОЧИТЬ ПО Товар
    ИТОГИ Сумма(Количество) ПО Товар Иерархия

    Его результат представлен в таблице:

    N

    Товар

    Количество

    1

    Сантехника

    104

    11

    Мебель

    134

    В эту таблицу добавлена колонка «N», которой нет в результате запроса, но которая будет использоваться нами в дальнейшем для идентификации записи в результате. Итоговые записи в таблице выделены курсивом, итоговые записи для иерархических уровней справочника выделены жирным шрифтом.

    Способы обхода результата запроса
    Линейный обход результата

    Первый, и самый простой способ обхода – линейный. При линейном обходе выборка будет выдавать записи в той последовательности, в которой они располагаются в результате запроса. В нашем примере это будут записи с номерами 1, 2, 3, 4, 5 и так далее до записи с номером 20.

    Для получения линейной выборки из результата необходимо вызвать метод Выбрать объекта РезультатЗапроса без параметров, либо с параметром ОбходРезультатаЗапроса.Прямой.

    Пример:

    СпособВыборки = ОбходРезультатаЗапроса . Прямой ;
    Выборка1 = РезультатЗапроса . Выбрать ( СпособВыборки ) ;
    // что равнозначно записи
    Выборка1 = РезультатЗапроса . Выбрать ( ) ;
    Иерархический обход результата

    Следующий способ обхода результата – иерархический. При данном обходе обходятся только записи, находящиеся на одном уровне. Для получения иерархической выборки из результата необходимо вызвать метод Выбрать() объекта РезультатЗапроса с параметром ОбходРезультатаЗапроса.ПоГруппировкамСИерархией.

    Пример:

    СпособВыборки = ОбходРезультатаЗапроса . ПоГруппировкамСИерархией ;
    Выборка2 = РезультатЗапроса . Выбрать ( СпособВыборки ) ;

    Выборка из результата с иерархическим обходом в нашем примере обойдет только записи с номерами 1 и 11, так как только эти две записи находятся на самом верхнем уровне. Проиллюстрируем это, представив наш результат в виде дерева, где узлами будут итоговые записи, а листьями дерева будут детальные записи. Вот что у нас получится:

    Из этого рисунка видно, что именно записи с номерами 1 и 11, и только они находятся на первом уровне дерева, в результате чего только они и попадают в первый проход иерархической выборки.

    Возникает вопрос, как получать остальные записи результата запроса. Для этого у объекта ВыборкаИзРезультатаЗапроса можно получить еще одну выборку, которая будет обходить подчиненные записи текущей записи выборки. В нашем примере в момент, когда объект Выборка2 будет позиционирован на запись с номером 1, мы запросим у него иерархическую выборку. Таким образом, мы получим выборку, которая нам вернет записи с номерами 2, 7. А когда Выборка2 будет спозиционирована на записи с номером 11, то полученная у нее иерархическая выборка вернет записи с номерами 12, 16. Так реализуется иерархический обход результатов запроса. Заметим, что у выборки можно получать вложенные выборки любого типа. Так, если бы мы запросили у Выборки2, спозиционированной на записи 1, линейную выборку, то с ее помощью мы бы получили записи с номерами записей со 2-го по 10-й. Проиллюстрируем описанную методику на примере.

    Пример:

    // Установим текст запроса
    Запрос . Текст = «ВЫБРАТЬ
    |Товар, Количество
    |ИЗ
    |Документ.РасхНакл.Состав
    |УПОРЯДОЧИТЬ ПО Товар
    |ИТОГИ Сумма(Количество) ПО Товар, Товар Иерархия» ;

    // Выполним запрос и запишем результат в переменную
    // РезультатЗапроса.
    РезультатЗапроса = Запрос . Выполнить ( ) ;

    // Получим выборку из результата запроса.
    СпособВыборки = ОбходРезультатаЗапроса . ПоГруппировкамСИерархией ;
    Выборка = РезультатЗапроса . Выбрать ( СпособВыборки ) ;

    Процедура ВыдатьРекурсивно ( Выборка )
    // Пока в выборке есть записи .
    Пока Выборка . Следующий ( ) Цикл
    // . выведем в окно сообщений поля из результата
    Товар = Выборка . Наименование ;
    Количество = Выборка . Количество ;
    Сообщить ( «Товар: » + Товар + » Количество: » + Количество ) ;

    Обход результата по группам

    Третий, и последний способ обхода результата – по группам. Он сходен с иерархическим обходом, но с одним различием: записи с иерархическими итогами при обходе в нем рассматриваются как детальные записи, а не как узловые. Для получения выборки по группам из результата запроса необходимо вызвать метод Выбрать объекта РезультатЗапроса с параметром ОбходРезультатаЗапроса.ПоГруппировкам.

    Пример:

    СпособВыборки = ОбходРезультатаЗапроса . ПоГруппировкам ;
    Выборка2 = РезультатЗапроса . Выбрать ( СпособВыборки ) ;

    Перебрав в ней всё, мы получим записи с номерами 1, 2, 7, 11, 12, 16.

    Пример:

    // Установим текст запроса
    Запрос . Текст = «ВЫБРАТЬ
    |Товар, Количество
    |ИЗ
    |Документ.РасхНакл.Состав
    |УПОРЯДОЧИТЬ ПО Товар
    |ИТОГИ Сумма(Количество) ПО Товар, Товар Иерархия»;

    // Выполним запрос и запишем результат в переменную
    // РезультатЗапроса.
    РезультатЗапроса = Запрос . Выполнить ( ) ;

    // Получим выборку из результата запроса
    СпособВыборки = ОбходРезультатаЗапроса . ПоГруппировкам ;
    Выборка = РезультатЗапроса . Выбрать ( СпособВыборки ) ;

    // Пока в выборке есть записи .
    Пока Выборка . Следующий ( ) Цикл
    // . выведем в окно сообщений поля из результата
    Товар = Выборка . Наименование ;
    Количество = Выборка . Количество ;
    Сообщить ( «Товар: » + Товар + » Итого по товару: » + Количество ) ;

    ВыдатьДочерниеЗаписи ( Выборка . Выбрать ( ) ) ;

    Работа с выборкой

    Объект ВыборкаИзРезультатаЗапроса предназначен для обхода записей результата запроса. Можно представить себе выборку как некоторый объект, который содержит указатель на текущую запись в результате и предоставляет программе доступ ко всем полям текущей записи. Для навигации по записям запроса используются три метода:

      – перейти к следующей записи результата в соответствии с порядком обхода выборки. При первом вызове позиционирует выборку на первую запись. Когда будут выбраны все записи, данный метод просигнализирует об этом, вернув значение Ложь. – получить следующую запись со значением в заданном поле, отличающимся от значения в этом поле текущей записи. – найти запись, с заданными значениями некоторых полей.
    Использование метода СледующийПоЗначениюПоля

    Метод позволяет сгруппировать записи результата по значениям полей.

    Пример запроса:

    ВЫБРАТЬ
    Док.Товар, Док.Получатель, Док.Количество
    ИЗ
    Документ.РасхНакл.Состав Док
    УПОРЯДОЧИТЬ ПО Док.Товар.Наименование, Док.Получатель.Наименование

    Источник

    Читайте также:  Медицинская компания наука самара официальный результаты анализов