Перейти к содержимому

Как обратиться к табличной части документа 1с

  • автор:

Запросы

Запросы представляют собой, табличную модель доступа к данным. С помощью запросов удобно организовывать чтение данных, по той причине, что с помощью одного запроса (здесь читаем обращения к серверу) можно в большинстве случаев получить все необходимые для работы данные. В случае с объектной моделью доступа(работа с классом Справочник.Выборка ), при получении каждого элемента в переборе система будет обращаться к серверу. В том случае если база 1С работает под управлением СУБД (клиент-серверный вариант) использование запросов является более оптимальным, потому что работа СУБД ориентирована на использование запросов. Результатом запроса всегда является одна таблица за исключением специфических случаев (например в случае пакетного запроса).

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

Виды таблиц

Таблицы в 1С делятся на реальные и виртуальные. Реальные таблицы, это те которые действительно существуют в базе данных. Виртуальные таблицы в базе не существуют, и представляют по сути, функции которые возвращают определенным образом отфильтрованные данные из реальных таблиц. Эти таблицы сделаны для удобства разработчиков. У виртуальных таблиц могут быть параметры. Для таблиц оборотов регистра накопления к примеру можно указать дату начала и дату окончания выборки оборотов. А для таблицы остатков этого же регистра, можно указать только дату, на которую будут получены остатки. Для этой таблицы можно указать условие (этим условием может быть отдельный запрос) и тогда будет наложен фильтр с указанным условием.

Если используется какое-либо условие при обращении к виртуальной таблице, необходимо указывать его в параметрах виртуальной таблицы, а не на закладке «Условия». Так как если указать условие в параметрах фильтр будет наложен в момент выполнения запроса к реальной таблице, а если указать в условии, то данные сначала будут получены, в полном объеме а уже потом наложен фильтр. В некоторых случаях такой запрос может оказаться просто "неподъемным" для сервера.

Не следует переоценивать роль параметров виртуальной таблицы. Бывает начинающие разработчики разобравшись как устанавливаются параметры в виртуальных таблицах, начинают использовать их вместо реальных, даже когда в этом нет необходимости, объясняя это тем, что параметры виртуальной таблицы, работают быстро, а условие в запросе медленно. Так как обращение к виртуальной таблице, это все равно, сложный развернутый запрос к реальной таблице, то такой подход, конечно, не имеет смысла. Запрос объявляется следующим образом:

Основной синтаксис языка запросов.

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

Таблицы и поля

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

Группировка строк запроса.

При формировании запроса очень часто бывает необходимо "свернуть" данные запроса, то есть к примеру у нас в результате выборки получились такие записи

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

Не следует путать группировку и итоги, что бы закрепить понимание, нужно запомнить, что в результате группировки записей будет или меньше, или столько же(если нет записей которые можно сгруппировать). Помимо функции Сумма, доступны и другие функции для группировки, полный список смотрите в конструкторе. Когда вы применяете группировку, поле должно либо быть группируемым(быть в верхней правой части на закладке "Группировка"), либо к нему должна применяться какая то агрегатная функция(поле должно быть в нижней части на закладке "Группировка"). При использовании других функций("количество различных" например) суммируемое поле, может быть не числовым. Пример запроса с группировкой

Условие и параметры в запросе

На результат выборки запроса, можно накладывать условия, которые могут быть достаточно разнообразными, в качестве условия могут выступать строковые или числовые константы, значения перечислений, предопределенные элементы справочников, подзапросы или любое значение переданное в параметре запроса. Для того, что бы указать, что выражение является параметром, перед ним указывают символ "&". За указание условия в запросе, отвечает секция "ГДЕ"

Передать параметр в запрос, можно следующим образом:

Псевдонимы

В случаях когда результат запроса может быть сразу выгружен в табличную часть документа, или в набор записей регистра, необходимо, что бы выходные поля запроса имели имена идентичные именам принимающей таблицы. Для того что бы присвоить полю свое имя его можно указать на закладке Объединения/Псевдонимы или в тексте запроса в секции указания списка полей указать ключевое слово КАК НовоеИмяВыходногоПоля напротив нужно поля. Поле для которого указан псевдоним, подсвечивается в конструкторе жирным шрифтом.

Объединения

Когда необходимо выбрать данные из двух никак не связанных таблиц, или получить выборку данных не связывая между собой таблицы, необходимо использовать объединение, оно соединяет таблицы горизонтально, то есть вы получаете не новые поля, а новые строки . Для этого в конструкторе на закладке Объединения/Псевдонимы необходимо добавить запрос и установить сопоставление полей с первым запросом. Или в тексте запроса добавить конструкцию "Объединить ВСЕ" после которой следует написать запрос, данные которого будут использоваться для объединения и проставить поля в том порядке в котором они следуют в первом запросе. Опция ВСЕ у конструкции ОБЪЕДИНИТЬ указывает на то, что в выборку попадут абсолютно все записи результата запроса, если убрать это слово то в результате второго запроса мы увидим, только те записи, которых нет в результате выборки первого запроса.

Соединения

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

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

Вложенные запросы

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

Сортировка

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

Тип данных NULL

NULL тип данных который можно получить только в одном месте: в запросе, этот тип данных получается, когда при соединении таблиц левым, правым или полным соединением, нет данных удовлетворяющих условию соединения. Любая проверка значения с этим типом всегда возвращает Ложь. Любая операция с этим полем возвращает NULL. Для обработки этого типа существуют следующие операторы:

Использование функций

Язык запросов обладает ограниченным набором функций, для обработки данных, так как считается, что запросы это средство для получения данных, а не для их обработки. Но необходимый минимум, все таки имеется. Например нет возможность получить дату без времени, но есть возможность привести дату к началу дня, месяца, года, с помощью функции, начало периода. Условный оператор тоже присутствует в виде функции "Выбор". Функция "Значение" позволяет в запросе получать значения перечислений, и к некоторым значениям системных перечислений(например вид движения регистра) или значений предопределенных значений справочника. Описание функций языка запросов, отсутствует во встроенном синтаксис помощнике, но его можно найти в справке которая находится в меню «Справка» или по кнопке F1. Там нужно открыть содержание справки (можно сразу его открывать из этого же меню, или по shift F1) и выбрать Встроенный язык – Работа с запросами – Синтаксис языка запросов – Ключевые слова и функции – Функции.

Получение данных из табличных частей документов

Если необходимо получить данные из табличной части какого либо документа, следует обращаться напрямую к табличной части документа. Если рассматривать конструктор запросов, то вот так делать неправильно:

А вот так будет правильно:

Разумеется в любом случае нужно наложить условие на поле "Ссылка" что бы не получить в результате запроса табличные части всех существующих в системе документов.

Как обратится к табличной части документа?

Сделал форму документа там два параметра и табличная часть с 3мя параметрами.
Создаю новый документ путем нажатия кнопки Создать в форме выбора документов.

Затем в этой форме документа (документ еще не создан, не проведен, только создается) заполняю программно реквизиты.

А вот с табличной частью так не получается Объект.ТабличнаяЧасть.П3 = ввпапв;
Ругается говорит нету Параметра3.

Фиг с ним знаю, что если сохранить документ то можно получить доступ к табличной части.
Пишу

Ругается Метод объекта не обнаружен.
Вопросы: 1. Как Мне программно сохранить и провести документ?
2. Как записать в табличную часть?

Добавлено через 58 минут
Ну с таблицей немного разобрался сделал так

Значение строки табличной части получить в табличной части другого документа
Есть документ ПриходнаяНакладная (товар приходит от поставщика по его цене), с табличной частью.

Программное заполнение табличной части документа из табличной части справочника
Доброго! Ситуация, поставившая меня в тупик. Имеем 1с 8.2 УФ Имеем справочник "Работ" Имеем.

Автоматическое заполнение табличной части документа из табличной части другого
Добрый день. Совсем недавно начал изучать 1С и пока не могу найти решения собственной задачи).

Как из одного документа перенести значение из табличной части в реквизит другого документа?
Только начинаю осваивать 1С, учебная задача. Есть два документа "Индивидуальный заказ" и.

Объект.Ссылка.ПолучитьОбъект(); = Объект, не надо так.
И не путай реквизиты с параметрами.

А команды записи и проведения на форме документа должны быть, если ты не произвольную создавал, обрабатываются они в МодулеОбъекта документа.
RTFM

Как обратится к табличной части в 8.3?

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

В форме документа в версии 8.1 (когда писал последний раз лет цать назад).
Я мог просто написать н-р ТабЧасть.Выбратьстроки().
Такое обращение проходит только из модуля документа.

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

п.с. И еще даже кнопку вставить не получается в форму.
Там просто нет поля, которое указывает на выполнение какой-то процедуры. Мама дорогая-)

(1) Для каждого ТвояСтрока Из ТачЧасть Цикл

и вперед заре на встречу 🙂

можно все таки синаксис плз.
Очень надо.

Нужно пройтись по всем строкам именно нового документа выполнить с каждой простое арифметическое действие перед записью.

Допустим сложить в КолонкуЦ КолонкуА и КолонкуБ
Как я понял в модуле формы это больше не сделать? надо топать в модуль документа?

&НаКлиенте
Процедура ИгрокиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)

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

Для каждого ТвояСтрока Из ТачЧасть Цикл

не работат ТачЧасть ничего не возвращает в модуле формы, видимо надо все это делать из модуля документа только

Программная работа с документами в 1С 8.3

Объект ДокументыМенеджер позволяет получить доступ ко всем менеджерам документов. Это можно сделать перебрав все менеджеры в цикле или обратившись к конкретному менеджеру по имени. Также данный объект позволяет проверить является ли ссылка ссылкой на какой-нибудь документ:

Создание документа программно

Чтобы программно создать документ нужно использовать метод менеджера документа СоздатьДокумент:


Программное заполнение документа

Для программного заполнения документа нужно обращаться к каждому реквизиту объекта по имени, через точку от объекта:

Программное заполнение табличной части документа

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

Программное изменение документа

Изменить документ можно только через программный объект. Для этого методом ПолучитьОбъект нужно получить из ссылки объект и потом изменить его реквизиты:


Программное копирование документа

Для создания копии объекта предназначен метод Скопировать. Данный метод есть как у ссылки на документ, так и у объекта:

Программное удаление документа

Пометить на удаление документ можно с помощью метода УстановитьПометкуУдаления. Параметром нужно передать значение пометки на удаление. При установке пометки на удаление документ автоматически распроводится, если он был проведен и записывается. Также можно полностью удалить документ из базы методом Удалить:

Программное проведение документа

У документа нет отдельного метода для проведения документа. Проведение — это запись документа с проведением. Для проведения документа используется метод Записать, в который параметром нужно передать режим записи документа. Всего есть три режима записи: запись, проведение, отмена проведения. Если параметр не указан, то используется запись:

Программная работа с движениями документа

Через свойство Движения можно обращаться к движениям проведенного документа и даже редактировать их. Рассмотрим на примере:

Программный поиск документа

Чтобы программно найти документ можно использовать методы НайтиПоНомеру и НайтиПоРеквизиту менеджера документа.

НайтиПоНомеру

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

НайтиПоРеквизиту

Метод НайтиПоРеквизиту принимает два параметра: имя реквизита и значение реквизита. Если реквизит имеет тип Строка, то поиск выполняется по точному соответствию. Нельзя искать по реквизиту с типом ХранилищеЗначения или неограниченная строка.

Выборка документов

Чтобы получить выборку документов можно воспользоваться методом Выбрать менеджера документа. Затем полученную выборку можно перебрать с помощью цикла Пока. На каждом витке цикла будут данные об одном документе. Через параметры метода можно ограничить выборку по периоду или по реквизитам.

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

Программная работа с ссылкой на документ

Через ссылку на документ можно обратиться к реквизитам объекта. При этом будет неявно выполнен запрос к базе данных для получения значения реквизита. Так как работа с базой данных возможна только на сервере, то на клиенте нельзя от ссылки получать значения реквизитов:

Для получения пустой ссылки можно использовать метод ПустаяСсылка. Для проверки на пустую ссылку можно воспользоваться методом Пустая:

Сопоставление документов по идентификатору

У каждого документа есть уникальный идентификатор, который присваивается при первой записи документа и не может быть изменен. Часто при обмене между двумя базами данных требуется сопоставлять документы. Для этого можно использовать идентификаторы.

Пример выгрузки идентификатора документа. Уникальный идентификатор получается из ссылки методом УникальныйИдентификатор:

Пример сопоставления документов по идентификатору. Здесь используется метод ПолучитьСсылку для получения ссылки на документ по уникальному идентификатору и метод УстановитьСсылкуНового чтобы уникальный идентификатор нового документа был равен уникальному идентификатору, полученному из другой базы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *