1с перебрать реквизиты объекта
В предыдущей статье я показал, как создавать перечисления 1С, значения перечислений, как указывать ссылку на нужное перечисление у реквизита объекта, и как работать с перечислением на управляемой форме. В этой статье я покажу некоторые моменты программной работы с перечислениями в языке программирования 1С.
Программная работа с перечислениями в 1С отличается в зависимости от того в каком контексте мы работаем с этим перечислением: в серверном или клиентском (конкретно на тонком клиенте и веб-клиенте). Поэтому разберем оба варианта по отдельности, также изучим, как работать с перечислениям в языке запросов 1С.
Перечисление в серверном контексте
Для того, чтобы понять как работать со значениями перечисления в серверном контексте, рассмотрим простую задачу: будем программно создавать элемент справочника и присваивать ему конкретное значение перечисления.
В моей учебной конфигурации, есть справочник Контарагенты, с реквизитом Статус, у которого тип ссылка на перечисление ЮридическийСтатусКонтрагента, которое было создано в предыдущей статье. Создадим программно нового контрагента, с уже конкретным значением перечисления. Делать я это будут на управляемой форме учебной обработки. На этой форме я создал команду, серверный и клиентский обработчик команды.
В серверном обработчике и будет создаваться новый элемент справочника.
В этом коде мы создаем объект справочника, заполняем его реквизиты какими-то значениями, а потом сохраняем. Реквизиту Статус мы присваиваем конкретное значение перечисления ЮридическийСтатусКонтреганта. Вы заметили, что к нужному перечислению мы обращаемся посредством объекта Перечисления, который имеет типа ПеречисленияМенеджер.
А выражение Перечисления.ЮридическийСтатусКонтрегента это менеджер конкретного перечисления, посредством которого можно обращаться к нужному значению перечисления. Причем обращение к значению идет по имени.
Посредством этого выражения мы можем обратиться к любому значению перечисления, в зависимости от поставленной задачи.
Если по какой-то причине нам не нужно записывать определенное значение перечисления, то мы можем записать пустую ссылку на это перечисление, обратившись к методу менеджера перечисления ПустаяСсылка(). Тогда будет иметь место следующий код.
Перечисление в клиентском контексте (на тонком клиенте)
Если в серверном контексте мы обращались напрямую к значению перечисления, используя менеджер перечислений, то в клиентском контексте мы так сделать не можем (за исключением толстого клиента).
Приведу небольшой пример, на котором покажем, как работать с перечислениями на клиенте, пример больше учебный, призванный показать, как работать с перечислениями в клиентском контексте, и не несет какого-либо прикладного смысла.
На управляемую форму поместим реквизит с типом ссылка на перечисления, и при выполнении команды формы будем записывать в этот реквизит конкретное значение перечисления.
Поскольку в предыдущей статье мы создали перечисление ЮридическийСтатусКонтрегента, то назовем реквизит формы СтатусИП, и будем при выполнении команды в него записывать соответствующее значение перечисления.
Создадим реквизит, поместим его на форму, и также я создам команду, которую помещу на форму.
Для этой команды создадим клиентский обработчик.
В этом клиентском обработчике, нам нужно записать в реквизит формы значение перечисления. Мы можем получить значение перечисления так, как получали ранее в этой статье: используя менеджер перечислений.
Если мы сейчас сделаем синтаксис-проверку модуля на ошибки, то в некоторых случаях может выдать ошибку, а в некоторых нет. Всё зависит от того, настроена ли в параметрах проверка в режиме тонкого клиента.
Проверим это. Зайдем в параметры конфигурации по пути Главное меню – Сервис – Параметры
В этой форме на закладке Модули в подзакладке Проверка нас интересует флаг Тонкий клиент.
Если этот флаг установлен, то при синтаксической проверке модуля, на код, который мы написали ранее, выйдет ошибка.
Поэтому, если вы планируете, что ваше приложение будет работать в режиме тонкого клиента, то способ получения значения перечисления, используя менеджер перечислений, не применим.
Чтобы получить в режиме тонкого клиента значение перечисления, нужно использовать метод глобального контекста ПредопределенноеЗначение. В этом случае код будет следующим.
В параметре этого метода в виде строки необходимо написать путь к значению перечисления. Замечу, что в платформе 1С, после ввода круглой скобки и первой кавычки выпадают подсказки, и по этим подсказками можно сгенерировать нужную строку.
Если мы сейчас запустим «1С: Предприятие» под тонким клиентом, то значением в реквизит прекрасно запишется.
Заметили, что обращались мы к имени значения перечисления, а на форме отображается синоним значения.
Перечисление в языке запросов 1С
Рассмотрим, как работать с перечислениями в языке запросов 1С.
Более подробно, изучить языка запросов 1С Вы можете в моем курсе «Запросы в 1С для начинающих», промо-код на скидку для читателей блога — hrW0rl9Nnx
Для того, чтобы понять как работать с перечислениями в запросе разберем простой и понятный пример. Из справочника Контрагенты отберем только тех, контрагентов, у которых статус ИП. Делать мы это будем сразу в «1С: Предприятии», в консоли запросов.
В консоли запросов откроем конструктор запроса, выберем таблицу Контрагенты и поля этой таблицы Наименование и Статус.
На закладке Условия установим, чтобы отбирались контрагенты со статусом ИП.
В этом случае мы используем функцию Значение языка запросов 1С, где в качестве параметра указываем путь к нужному нам значению перечисления.
У нас должен получиться вот такой запрос:
Который будет возвращать контрагентов только с нужным статусом.
Функцию ЗНАЧЕНИЕ можно использовать не только в условиях, но и в секции выбрать. Например, можно сделать такой запрос.
Который будет возвращать два значения перечисления.
А что делать, если нужен отбор по нескольким значениями перечислений? Для этого мы объединим два этих запроса: поместим во временную таблицу значения двух перечислений, а потом при получении контрагентов, в условии при помощи оператора множественного выбора отберем контрагентов только с двумя значениями перечислений.
Код запроса будет в этом случае следующим:
И этот запрос будет выдавать нужный результат.
Если же мы не знаем, по какому значению перечисления нужен отбор, то можем просто передать значение нужного перечисления в качестве параметра. В этом случае будет такой запрос.
Который будет выполняться следующим образом.
Если же мы хотим сделать отбор по нескольким сразу статусам (которые мы не можем знать заранее), то нам нужно передать в запрос массив или список значений, и применить к нему оператор множественного выбора. В этом случае у нас будет следующий запрос.
С таким результатом.
Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Язык запросов в 1С для начинающих». Где эти и многие другие вопросы рассматриваются более подробно.
В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком
Для моих читателей, купон на скидку 25%: hrW0rl9Nnx
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
1С:Предприятие 8.3 (8.3.4.437) в режиме управляемого приложения
Возникла следующая проблема.
Задача: получить все табличные документы из некой формы.
Решение: для этого нужно получить все реквизиты этой формы (метод ПолучитьРеквизиты()), отсеять ненужное и все.
На первый взгляд все просто, если бы не одно "но".
Инициатором действий является ОбщаяКоманда. т.е. к форме в этом случае можно достучаться только через ПараметрыВыполненияКоманды.Источник (коим как раз является нужная УправляемаяФорма)
Из клиента на сервер эту самую форму можно передать через ВременноеХранилище, потом на сервере и делать все что нужно.
Примерно такой код:
А вот здесь возникает это самое "НО". если форму получать из временного хранилища, то при выполнении УправляемаяФорма.ПолучитьРеквизиты() платформа ругается
Ошибка при вызове метода контекста (ПолучитьРеквизиты)
ВсеРеквизиты=УправляемаяФорма.ПолучитьРеквизиты();
по причине:
Метод недоступен на клиенте
Если это делать через объект ЭтаФорма (контекстный вызов сервера), то метод отрабатывает как нужно.
ЭтаФорма и то, что я получаю из временного хранилища имеют одинаковые типы. А вот результат работы разный.
Народ, как можно побороть это "несчастье"?
Ну негде в моем случае взять контекст формы на сервере.
(7) AlX0id, спасибо, но как раз с этим проблем никаких нет. Но это называется "костыль". И этот список табдоков в таком случае нужно пихать в каждую форму, где есть несколько табдоков. Вот я и пытаюсь выяснить, как можно без забивания костылей обойтись, когда эти табдоки уже есть в форме, есть сама форма в качестве источника, есть метод, с помощью которого (теоретически) можно отловить все табдоки. Дело за небольшим. осталось заставить этот метод отработать. :)
И ваще. ну как можно ругаться на клиента, если метод отрабатывается на сервере. просто бред какой-то, блин.
(8) kentavr27,
Ну я как бы полагал, что там, где вы помещаете во временное хранилище форму, там и обработать реквизиты. Вы же не полагали помещать формы в хранилище в разных местах? Вот там бы и обработали. Кстати, попробовал запихать форму в 8.3 в хранилище - нэ лэзэ..
Ну я как бы полагал, что там, где вы помещаете во временное хранилище форму, там и обработать реквизиты. Вы же не полагали помещать формы в хранилище в разных местах? Вот там бы и обработали.
Так вот здесь как раз и затык получается.
Все начальные действия по поиску нужных реквизитов должны происходить в общей команде. Примерно так
ПараметрыВыполненияКоманды.Источник доступен только на клиенте. Метод ПолучитьРеквизиты() доступен на сервере. Напрямую на сервер объект УправляемаяФорма (ПараметрыВыполненияКоманды.Источник)передать нельзя, только через временное хранилище. Как объект, УправляемаяФорма помещается во ВХ без проблем.
А вот когда уже получил на сервере и применил к нему метод ПолучитьРеквизиты() -- вот здесь вылазят грабли.
Да, если на форме создать реквизит типа СписокТабДоков (СписокЗначений) и засунуть туда все ТабДоки -- то без проблем получаю прямо на клиенте по имени этот реквизит и отправляю его в общую форму. Но такой реквизит нужно создавать на всех формах и пихать туда табДоки во время их заполнения прямо в той форме. Ладно если таких форм может быть только 1-2. А если их 15-20 а через месяц к ним еще десяток форм добавиться например.
Ежели выполнить ВсеРеквизиты=ЭтаФорма.ПолучитьРеквизиты() на сервере прямо в контексте формы, то все отрабатывается нормально
Похоже что 1С что-то намудрило, и для системы ПараметрыВыполненияКоманды.Источник и ЭтаФорма (в контексте формы) несколько разные объекты, хотя и визуально и их тип абсолютно совпадают. А вот объехать этот баг без создания дополнительного реквизита в форме пока не получается.
(10) все просто.
Сообщить(Реквизит + " +" может быть использован как в сложении, так и в конкатенации строк.
Реквизит это не строка. Платформа пытается привести к числу. Тоже не получается. Вот и ошибка: "Преобразование значения к типу Число не может быть выполнено"
Когда ставим "" + Реквизит, то уже объект Реквизит платформой неявно приводится к строке. Вот и отрабатывает.
Или сразу указываем "Реквизит.Имя". Это уже строка и конкатенация строк отрабатывает штатно.
(10)
Следите за пальцами
Реквизит - тип ОбъектМетаданных
"" + Реквизит - тип Строка, т.к при сложении все преобразуется к типу первого слагаемого
Реквизит.Имя - тип Строка
А сложение Реквизит + " clear">
(1) А что есть ОбъектБД? Что значит, не работает, какую ошибку выдает?
Для ссылочных типов вместо НайтиПоТипу можно использовать ОбъектБД.Метаданные()
(2) Либо Документ.Ссылка либо Справочник Ссылка (составной тип на форме).
Сообщить("" + Реквизит.Имя + " clear">
листинг 3.17. Использование итератора «Для Каждого»
(5) Нет, к реквизиту можно обратиться или через точку, или через квадратные скобки. Так что вот такой код точно сработает для ссылочных типов:
Для Каждого Реквизит Из ОбъектБД.Метаданные().Реквизиты Цикл Сообщить(Реквизит.Имя + " clear">
(8) Потому что у вас переменная Реквизит. А это не строка, а ОбъектМетаданных. У меня Реквизит.Имя - а это уже строка
(10) все просто.
Сообщить(Реквизит + " +" может быть использован как в сложении, так и в конкатенации строк.
Реквизит это не строка. Платформа пытается привести к числу. Тоже не получается. Вот и ошибка: "Преобразование значения к типу Число не может быть выполнено"
Когда ставим "" + Реквизит, то уже объект Реквизит платформой неявно приводится к строке. Вот и отрабатывает.
Или сразу указываем "Реквизит.Имя". Это уже строка и конкатенация строк отрабатывает штатно.
(10)
Следите за пальцами
Реквизит - тип ОбъектМетаданных
"" + Реквизит - тип Строка, т.к при сложении все преобразуется к типу первого слагаемого
Реквизит.Имя - тип Строка
А сложение Реквизит + " clear">
(17) много чего есть, только не доступные через метаданные объекта.
Реквизиты, ТабличныеЧасти и СтандартныеРеквизиты доступны. Общие резквизиты - нет.
"вончо" написал. даже работает)
Процедура ТыкНаСервере(ОбъектБД) МетаданныеОбъектБД = Метаданные.НайтиПоТипу(ТипЗнч(ОбъектБД)); Для Каждого Реквизит Из МетаданныеОбъектБД.Реквизиты Цикл Сообщить(""+Реквизит + " = " + ОбъектБД[Реквизит.Имя]); КонецЦикла; Для Каждого ТЧ Из ОбъектБД.Метаданные().ТабличныеЧасти Цикл Сообщить(""+ТЧ); НомерСтроки = 1; Для Каждого Строка Из ОбъектБД[ТЧ.Имя] Цикл Для Каждого Реквизит Из ТЧ.Реквизиты Цикл Сообщить("Строка номер " + НомерСтроки + " " + Реквизит + " timeline-seperator text-center text-primary no-margin no-border"> Показать
(2) Насколько понимаю, так не попадут "Стандартные" (Ссылка, Проведен, Номер, ПометкаУдалениея, Дата, Номер).
Ага.
А потом: Таблицы. Колонки. ДополнительныеСвойства.
далее выгружаем в ТЗ, у которой смотрим все столбцы..
PS если надо, по содержимому отсекаем табличные части..
Ссылки все равно не видит. Пишет поле объекта не обнаружено при попытке Реквизит.Отгруженно.получитьобъект();
Реквизит.Отгруженно ссылка на другой документ. Цикл должен перебрать все реквизиты в документе найти реквизит.отгружеено получить объект и уже в другом документе заполнить некоторые реквизиты
(11)Пипец. Проверить наличие реквизита и получить его значение - две совершенно разные задачи. А кто-то похоже еще и не различает метаданные и реквизиты конкретного документа.
А зачем перебирать все реквизиты если имя нужного реквизита уже известно?
и как верно заметили выше, для чего вам перебирать, если вы заранее знаете реквизит, который нужен?
(21)Очень информативно. Напоминает лечение даже не по фотографии, а по описанию фотографии слепым.
Может таки сподобитесь и покажете код, а не рассказ о нём?
Это уж вы, батенька, сами должны заполнить сию переменную ссылкой на конкретный документ. Надеюсь, вы не крутите цикл по реквизитам в цикле по документам одного типа?
(17)Вы хотите сказать, что Документ.АвансовыйОтчет может иметь разное количество реквизитов в конкретных экземплярах?
Зачем для каждого документа в выборке проверять наличие реквизита? Результат проверки что ли может быть разный?
(18) Я для примера написал, если делать выборку каким-то запросом, то не факт, что там будет только АвансовыйОтчёт
В документе есть реквизит с ссылкой на другой документ задача обратиться к этому реквизиту получить документ на который ссылается этот реквизит и уже в этом документе проставить некоторые значения
В каком документе? Точнее, в каком типе/виде документов? Только Авансовый отчет? Или еще есть другие типы/виды?
Если только Авансовый отчет, то нафига перебирать метаданные документа?
Реквизит один? Известный?
Это все предлагается угадать?
(25) Документ не авансовый отчет. Допустим реквизит 1 и известный. Тип реквизита ссылка на другой документ. Задача обратиться к этому рееквизиту и получить документ на который ссылается реквизит и там проставить некоторые значения.
(26) Ну так и делайте ДокОбъект = [Документ не авансовый отчет].[реквизит 1 и известный].ПолучитьОбъект()
(26)Думаете, повторение одного и того же как мантры сильно повышает информативность повторов? Еще древние установили что "Сколько раз не скажи ХАЛВА во рту слаще не станет".
А какой? Один? Или несколько? Список известен?
Из вас все надо клещами тянуть? Кому это надо? Вам или нам?
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем 1С Предприятие что это? 12
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое Посмотреть все результаты поиска похожих
Еще в этой же категории
Как обновить динамический список или реквизит на форме клиента? 22
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором? 18
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Как установить параметр динамического списка? 16
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента Для вывода используется исп Форма ~ Программное создание таблицы значений с условным оформлением 12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора ~ Заполнение списка значений в элементе поле выбора на форме 10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип - Произвольный, Использование - Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Посмотреть все в категории Работа с Формой (Диалог) и её элементами
Читайте также: