Работа с метаданными 1С

Кладовщику нужно выгрузить список всей номенклатуры, у которой не установлена пометка удаления. Поля для выгрузки:

  1. Наименование.
  2. Артикул.
  3. Вид номенклатуры.
  4. Тип номенклатуры.

Вот так будет выглядеть таблица Excel после выгрузки:

Рассмотрим два способа решения: без программирования и с участием программиста.

Программируем

Чтобы выгрузить номенклатуру в XLS-файл сформируем запрос к базе данных для получения номенклатуры и поместим результат в табличную часть обработки выгрузки. Вот форма обработки:

По нажатию на кнопку «Заполнить» заполняется табличная часть «ДанныеВыгрузки» обработки, у которой добавлены соответствующие реквизиты. Обработчик этой кнопки имеет следующий программный код:

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

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

Процедура ОсновныеДействияФормыДействие(Кнопка) // Вызываем диалог выбора файла для сохранения XLS-таблицы Режим = РежимДиалогаВыбораФайла. Сохранение; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим) ; ДиалогОткрытияФайла. ПолноеИмяФайла = » » ; ДиалогОткрытияФайла. МножественныйВыбор = Ложь ; Текст = » ru = » » Таблица XLS » » ; en = » » XLS table » » » ; Фильтр = НСтр(Текст) + » (* . xls) |* . xls » ; ДиалогОткрытияФайла. Фильтр = Фильтр; ДиалогОткрытияФайла. Заголовок = » Выберите путь для сохранения » ; Если ДиалогОткрытияФайла. Выбрать() Тогда ПутьКФайлу = ДиалогОткрытияФайла. ПолноеИмяФайла; Иначе Текст = » Путь сохранения не выбран! » ; Предупреждение(Текст) ; Возврат ; КонецЕсли ; // Создаем табличный документ ТаблицаСохранение = Новый ТабличныйДокумент; // Получаем макет заполнения и области макета Макет = ЭтотОбъект. ПолучитьМакет(» ТаблицаВыгрузки » ) ; ОбластьШапка = Макет. ПолучитьОбласть(» Шапка » ) ; ОбластьСтрока = Макет. ПолучитьОбласть(» Строка » ) ; // Выводим данные в табличный документ ТаблицаСохранение. Вывести(ОбластьШапка) ; Для Каждого Стр Из ДанныеВыгрузки Цикл ЗаполнитьЗначенияСвойств(ОбластьСтрока. Параметры, Стр) ; ТаблицаСохранение. Вывести(ОбластьСтрока) ; КонецЦикла ; // Сохраняем табличный документ на диск ТаблицаСохранение. Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента. XLS) ; КонецПроцедуры

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

Пользователь может сам

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

Например, перейдя в список номенклатуры и выполнив команду «Все действия» -> «Вывести список» из списка номенклатуры, пользователь получит список номенклатуры в сформированном табличном документе.

После того, как табличный документ будет сформирован, нажав на кнопку «Сохранить» или через меню «Файл->Сохранить» пользователь может записать табличный документ в файл XLS указав его имя и конечный каталог.

Вот и все! Никакой обработки для выгрузки не нужно. Конечно, если у вас достаточно простой случай с выгрузкой данных.

Так все просто?

Действительно все просто, никаких внешних компонент подключать не нужно. К тому же, мы можем выполнить выгрузку таким способом не только в файлы формата таблиц Excel, но и другие форматы, поддерживаемые платформой.

Обработку с примером из статьи Вы можете скачать по ссылке .

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

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

Поэтому в 1С видное место занимает работа с таблицами.

Таблицы в 1С также называют «табличные части». Они есть у справочников, документов и других .

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

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

Важная особенность – в таблице, которая получена из результата запроса, все колонки будут строго типизированы. Это значит, что запросив поле Наименование из справочника Номенклатура, Вы получите колонку вида Строка с допустимой длиной не более N символов.

Таблица на форме (толстый клиент)

Пользователь работает с таблицей, когда она размещена на форме.

Базовые принципы работы с формами мы с Вами обсуждали в уроке по и в уроке по

Итак, разместим таблицу на форме. Для этого можно перетащить таблицу с панели элементов управления. Аналогично можно выбрать в меню Форма/Вставить элемент управления.

Данные могут храниться в конфигурации – тогда нужно выбрать существующую (ранее добавленную) табличную часть того объекта конфигурации, форму которого Вы редактируете.

Нажмите кнопку «…» в свойстве Данные. Для того, чтобы увидеть список табличных частей, нужно раскрыть ветку Объект.

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

В этом же свойстве Данные Вы можете ввести произвольное имя и выбрать тип ТаблицаЗначений.

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

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

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

Чтобы управлять таблицей, нужно вывести на форму командную панель. Выберите пункт меню Форма/Вставить элемент управления/Командная панель.

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

Таблица на форме (тонкий/управляемый клиент)

На управляемой форме указанные действия выглядят немного по другому. Если Вам нужно разместить на форме табличную часть – раскройте ветку Объект и перетащите одну из табличных частей влево. И все!

Если нужно разместить таблицу значений, добавьте новый реквизит формы и в его свойствах укажите тип – таблица значений.

Чтобы добавить колонки, используйте меню по правой кнопке мыши на этом реквизите формы, пункт Добавить колонку реквизита.

После чего также перетащите таблицу влево.

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

Выгрузка таблицы в Excel

Любую таблицу 1С, расположенную на форме, можно распечатать или выгрузить в Excel.

Для этого щелкните правой кнопкой мыши на свободном месте в таблице и выберите пункт Вывести список.

В управляемом (тонком) клиент аналогичные действия можно выполнить с помощью пункта меню Все действия/Вывести список.

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

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

Структура таблицы значений как объекта

Свойства таблицы значений определяются комбинациями двух предопределенных коллекций: ее колонок и строк.

Таблица значений Колонки

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

Так как колонки являются коллекцией объектов, то вы можете добавлять, удалять и редактировать колонки.

Строка таблицы значений

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

Таким образом, взаимодействие со строкой очень похоже на взаимодействие с прочими объектами. Можно считывать и записывать ее свойства, в том числе с использованием предопределенной функции «ЗаполнитьЗначенияСвойств()». Так как строки являются основной коллекцией таблицы значений, то чтобы удалить все строки таблицы, применяется метод «Очистить()».

Создать таблицу значений

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

Создание таблицы конструктором

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

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

Создание таблицы копированием

Если у вас под рукой есть эталон с подходящей структурой и/или составом, вы можете скопировать или выгрузить эталонную таблицу значений. Если эталоном является другая таблица, то необходимо применить метод «Скопировать таблицы-эталона». Если вы имеете дело с табличной частью или набором записей регистра, необходимо использовать метод «Выгрузить таблицу значений». Если вам необходима только структура, то можно воспользоваться методом «СкопироватьКолонки».

// Вариант с копированием из ТЗ-эталона всех строк но с сохранением лишь двух указанных колонок КолонкиЭталона = «Номенклатура,Количество»; ДемоТаблица = ТаблицаЭталон.Скопировать(, КолонкиЭталона); // Вариант с копированием из ТЗ-эталона предварительно отобранных строк,с сохранением двух указанных колонок СтрокиЭталона = ОтобратьВМассивНужныеНамСтрокиИзТаблицыЭталона(); КолонкиЭталона = «Номенклатура,Количество»; ДемоТаблица = ТаблицаЭталон.Скопировать(СтрокиЭталона, КолонкиЭталона); // Вариант с копированием из ТЗ-эталона строк по указанному фильтру,с сохранением одной колонки «Номенклатура” // Будут отобраны все строки где значение в колонке Количество равно 0, в результирующую таблицу попадет только колонка Номенклатура ОтборСтрок = Новый Структура(«Количество», 0); КолонкиЭталона = «Номенклатура»; ДемоТаблица = ТаблицаЭталон.Скопировать(СтрокиЭталона, КолонкиЭталона); // Вариант с полным копированием таблицы и последующем удалении одной строки со значением поля количество равным нулю и удалением целой колонки «Количество” ОтборСтрок = Новый Структура(«Количество», 0); КолонкиЭталона = «Номенклатура»; ДемоТаблица = ТаблицаЭталон.Скопировать(СтрокиЭталона, КолонкиЭталона); СтрокаТаблицы = ДемоТаблица.Найти(0, «Количество»); ДемоТаблица.Удалить(СтрокаТаблицы); ДемоТаблица.Колонки.Удалить(«Количество»); // Аналогичные варианты и их модификации можно применять к табличным частям и наборам записей регистров

Создание таблицы запросом

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

// Пример с созданием пустой таблицы по образцу структуры регистра накопления // Нетрудно догадаться, что таким образом можно получить и заполненную таблицу Запрос = Новый Запрос(«ВЫБРАТЬ ПЕРВЫЕ 0 * Из РегистрНакопления.ТоварынаСкладе»); РезультатЗапроса = Запрос.Выполнить(); ДемоТаблица = РезультатЗапроса.Выгрузить(); // Пример с созданием пустой таблицы по явно заданным типам и именам полей Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ ПЕРВЫЕ 0 | Значение(Справочник.Номенклатура.ПустаяССылка) КАК Номенклатура, | ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 3)) КАК Количество»; РезультатЗапроса = Запрос.Выполнить(); ДемоТаблица = РезультатЗапроса.Выгрузить(); // ВАЖНО! Не стоит забывать, что в типах значений колонок, полученных из запроса всегда присутствует тип Null // Таким образом, ТЗ созданная запросом, всегда имеет составные типы колонок

Заключение

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

Метаданные 1С – это список справочников, документов, их реквизитов и прочего, составляющего конфигурацию. Список метаданных 1С правится программистов в конфигураторе в окне конфигурации.

Из программы на языке 1С доступен список метаданных 1С и их свойства.

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

Рассмотрим, как работать с метаданными 1С конфигурации из языка 1С.

Метаданные 1С конфигурации

Глобальная переменная Метаданные дает доступ к метаданным 1С всей конфигурации (т.е. к «корню» конфигурации). Далее через точку можно обращаться к «коллекциям» — документы, справочники и т.п., чтобы выйти на конкретный справочник или документ, у которых соответственно есть «коллекции» реквизиты, табличные части и т.п. – все, как в конфигураторе, в дереве конфигурации.

Пример – создадим список всех документов конфигурации для того, чтобы пользователь мог выбрать нужный документ из списка:
спДокументовКонфигурации = Новый СписокЗначений(); //сюда будем сохранять список

//Метаданные — глобальная переменная, которая дает доступ ко всем метаданным 1С конфигурации
//Метаданные.Документы — коллекция документов конфигурации
Для каждого Документ из Метаданные.Документы Цикл
//Документ — это метаданные 1С документа (каждого, так как мы обходим их в цикле)
//.Имя — наименование документа так, как оно задано в конфигурации
//.Синоним — «человеческое» наименование документа, которое отображается пользователю
//список значений может хранить значение (имя документа) и «представление для пользователя» (как раз — синоним документа)
спДокументовКонфигурации.Добавить( Документ.Имя, Документ.Синоним );
КонецЦикла;

//даем возможность пользователю выбрать из списка нужный документ
элДокумент = спДокументовКонфигурации.ВыбратьЭлемент();

//если пользователь нажал «Отмена», то результатом выбора будет значение НЕОПРЕДЕЛЕНО, иначе результатом будет — выбранный элемент
Если элДокумент Неопределено Тогда
//в .Значение списка значений мы записывали имя документа «как в конфигурации»
//создадим новый документ с таким именем, напомним — к документам можно обращаться Документы.ИмяДокумента или Документы
обДокумент = Документы.СоздатьДокумент();
//ДокументОбъект.ПолучитьФорму() — возвращает форму с указанным именем, а если имя не указано — то форму «по-умолчанию»
обДокумент.ПолучитьФорму().Открыть();
КонецЕсли;

Пример – для общего журнала документов (отображающего все виды документов) создадим запрос, который вернет список всех документов:

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Метаданные 1С объекта

Большинство объектов 1С, сохраняемых в базе данных (справочники, документы и т.д.) представлены ссылками и объектами (подробнее см. «Ссылки и объекты»).

У ссылок и объектов есть метод .Метаданные(), который позволяет выйти на метаданные 1С этого объекта.

Пример – проверка на наличие реквизитов с типом «Справочник.Организация» в документе и обнуление значения этих реквизитов:
//ДокументОбъект — документ, полученный на изменение или создание
//аналогичным образом можно работать со ссылками, например: ДокументСсылка = Документ.ИмяДокумента.ПустаяСсылка().Метаданные()
ДокументОбъект = Документы.ПоступлениеТоваров.СоздатьДокумент();

//цикл по реквизитам
Для каждого Реквизит из ДокументОбъект.Метаданные().Реквизиты Цикл
//у каждого реквизита может быть как один, так и несколько типов, подробнее см. «ОписаниеТипов»
мТипов = Реквизит.Тип.Типы();
//проверяем по каждому типу — тот ли это нужный нам?
Для каждого Тип из мТипов Цикл
Если Тип = Тип(«СправочникСсылка.Организации») Тогда
//обнуляем реквизит с этим именем в документе
//для «обнуления» можно приравнивать его к Неопределено,
//по факту значение будет установлено не Неопределено, а «пустое значение» типа реквизита
//Неопределено только если у реквизита несколько типов
ДокументОбъект = Неопределено;
КонецЕсли;
КонецЦикла;
КонецЦикла;

//цикл по табличным частям
Для каждого ТабЧасть из ДокументОбъект.Метаданные().ТабличныеЧасти Цикл
//в табличной части тоже реквизиты (колонки таб.части)
Для каждого Реквизит из ТабЧасть.Реквизиты Цикл
//здесь аналогично
мТипов = Реквизит.Тип.Типы();
Для каждого Тип из мТипов Цикл
Если Тип = Тип(«СправочникСсылка.Организации») Тогда
//так как это таб.часть, то мы должны пройтись по всем строкам этой тач. части
Для каждого Строка из ДокументОбъект Цикл
Строка = Неопределено;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;