Объектная модель схемы запроса Периодически во встроенном языке возникает необходимость изменения текста запроса в зависимости от разных алгоритмических условий. Раньше подобная задача решалась путём непосредственного формирования нужного текста запроса в виде строки. А это не всегда удобно и зачастую очень громоздко.
Теперь во встроенном языке мы реализовали объектную модель схемы запроса. Вы можете создать пустую схему запроса конструктором и загрузить в неё имеющийся текст запроса. После этого отдельные элементы текста запроса будут доступны вам как свойства объектной модели.
На рисунке ниже стрелки показывают, в каких объектах встроенного языка будут доступны те или иные элементы простого запроса, загруженного в схему:
Редактирование текста запроса с помощью объектной модели позволяет вам проще и понятнее модифицировать имеющиеся запросы. Или даже создавать их во встроенном языке «с нуля». А затем просто получать готовый текст запроса из схемы методом ПолучитьТекстЗапроса() .
Пример использования Схемы запроса Код 1C v 8.3
СхемаЗапроса = Новый СхемаЗапроса;
ЗапросВыбораИзИБ = СхемаЗапроса. ПакетЗапросов[0 ];
ЗапросВыбораИзИБ. ТаблицаДляПомещения = "ТаблицаОбороты" ;
ЗапросВыбораИзИБ. ВыбиратьРазрешенные = Истина ;
ОператорВыбораЗакупок = ЗапросВыбораИзИБ. Операторы[0 ];
ИсточникНоменклатура = ОператорВыбораЗакупок. Источники. Добавить( "Справочник.Номенклатура" , "Товары" ) ;
ИсточникЗакупки = ОператорВыбораЗакупок. Источники. Добавить( "РегистрНакопления.Закупки.Обороты" , "Закупки" ) ;
ИсточникЗакупки. Источник. Параметры[0 ]. Выражение = Новый ВыражениеСхемыЗапроса( "&Начало" ) ;
ИсточникЗакупки. Источник. Параметры[1 ]. Выражение = Новый ВыражениеСхемыЗапроса( "&Окончание" ) ;
ИсточникЗакупки. Источник. Параметры[2 ]. Выражение = Новый ВыражениеСхемыЗапроса( "Месяц" ) ;
ИсточникЗакупки. Соединения[0 ]. ТипСоединения = ТипСоединенияСхемыЗапроса. ПравоеВнешнее;
ОператорВыбораЗакупок. ВыбираемыеПоля. Добавить( "Товары.Ссылка" ) ;
ОператорВыбораЗакупок. ВыбираемыеПоля. Добавить( "Закупки.Период" ) ;
ОператорВыбораЗакупок. ВыбираемыеПоля. Добавить( "ЕСТЬNULL(Закупки.СуммаОборот, 0)" ) ;
ОператорВыбораЗакупок. ВыбираемыеПоля. Добавить( "0" ) ;
ЗапросВыбораИзИБ. Колонки[0 ]. Псевдоним = "Номенклатура" ;
ЗапросВыбораИзИБ. Колонки[1 ]. Псевдоним = "Период" ;
ЗапросВыбораИзИБ. Колонки[2 ]. Псевдоним = "СуммаЗакупок" ;
ЗапросВыбораИзИБ. Колонки[3 ]. Псевдоним = "СуммаПродаж" ;
ОператорВыбораЗакупок. Отбор. Добавить( "НЕ Товары.ЭтоГруппа" ) ;
ОператорВыбораПродаж = ЗапросВыбораИзИБ. Операторы. Добавить( ) ;
ИсточникНоменклатура = ОператорВыбораПродаж. Источники. Добавить( "Справочник.Номенклатура" , "Товары" ) ;
ОператорВыбораПродаж. ВыбираемыеПоля. Добавить( "Товары.Ссылка" ) ;
ИсточникПродажи = ОператорВыбораПродаж. Источники. Добавить( "РегистрНакопления.Продажи.Обороты" , "Продажи" ) ;
ИсточникПродажи. Источник. Параметры[0 ]. Выражение = Новый ВыражениеСхемыЗапроса( "&Начало" ) ;
ИсточникПродажи. Источник. Параметры[1 ]. Выражение = Новый ВыражениеСхемыЗапроса( "&Окончание" ) ;
ИсточникПродажи. Источник. Параметры[2 ]. Выражение = Новый ВыражениеСхемыЗапроса( "Месяц" ) ;
ИсточникПродажи. Соединения[0 ]. ТипСоединения = ТипСоединенияСхемыЗапроса. ПравоеВнешнее;
ОператорВыбораПродаж. ВыбираемыеПоля. Добавить( "Продажи.Период" ) ;
ВыражениеЗакупки = ОператорВыбораПродаж. ВыбираемыеПоля. Добавить( "0" ) ;
ВыражениеПродажи = ОператорВыбораПродаж. ВыбираемыеПоля. Добавить( "ЕСТЬNULL(Продажи.СуммаОборот, 0)" ) ;
ЗапросВыбораИзИБ. Колонки[2 ]. Поля. Установить( 1 , ВыражениеЗакупки) ;
ЗапросВыбораИзИБ. Колонки[3 ]. Поля. Установить( 1 , ВыражениеПродажи) ;
ОператорВыбораПродаж. Отбор. Добавить( "НЕ Товары.ЭтоГруппа" ) ;
ЗапросВыбораИзИБ. Индекс. Добавить( ЗапросВыбораИзИБ. Колонки[0 ]) ;
ЗапросВыбораИзИБ. Индекс. Добавить( ЗапросВыбораИзИБ. Колонки[1 ]) ;
ОператорВыбораПродаж. ВыбиратьРазличные = Истина ;
ОператорВыбораПродаж. КоличествоПолучаемыхЗаписей = 100 ;
ЗапросВыбораИзВТ = СхемаЗапроса. ПакетЗапросов. Добавить( ) ;
ОператорВыбрать = ЗапросВыбораИзВТ. Операторы[0 ];
Источник = ОператорВыбрать. Источники. Добавить( "ТаблицаОбороты" , "ТаблицаОбороты" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "ТаблицаОбороты.Номенклатура" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "ТаблицаОбороты.Период" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "СУММА(ТаблицаОбороты.СуммаЗакупок)" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "СУММА(ТаблицаОбороты.СуммаПродаж)" ) ;
ОператорВыбрать. Отбор. Добавить( "СУММА(ТаблицаОбороты.СуммаЗакупок) > 0" ) ;
ЗапросВыбораИзВТ. Колонки[0 ]. Псевдоним = "Номенклатура" ;
ЗапросВыбораИзВТ. Колонки[1 ]. Псевдоним = "Период" ;
ЗапросВыбораИзВТ. Колонки[2 ]. Псевдоним = "СуммаЗакупок" ;
ЗапросВыбораИзВТ. Колонки[3 ]. Псевдоним = "СуммаПродаж" ;
ЗапросВыбораИзВТ. Порядок. Добавить( ЗапросВыбораИзВТ. Операторы[0 ]. Источники[0 ]. Источник. ДоступныеПоля[0 ]. Поля[6 ]) ;
ЗапросВыбораИзВТ. Порядок. Добавить( ЗапросВыбораИзВТ. Колонки[1 ]) ;
ИтогНоменклатура = ЗапросВыбораИзВТ. КонтрольныеТочкиИтогов. Добавить( ЗапросВыбораИзВТ. Колонки[0 ]) ;
ИтогНоменклатура. ТипКонтрольнойТочки = ТипКонтрольнойТочкиСхемыЗапроса. ТолькоИерархия;
ЗапросВыбораИзВТ. ОбщиеИтоги = Истина ;
ЗапросВыбораИзВТ. ВыраженияИтогов. Добавить( ЗапросВыбораИзВТ. Колонки[2 ]) ;
ЗапросВыбораИзВТ. ВыраженияИтогов. Добавить( ЗапросВыбораИзВТ. Колонки[3 ]) ;
ЗапросУничтоженияВТ = СхемаЗапроса. ПакетЗапросов. Добавить( Тип( "ЗапросУничтоженияТаблицыСхемыЗапроса" ) ) ;
ЗапросУничтоженияВТ. ИмяТаблицы = "ТаблицаОбороты" ;
Если ЗначениеЗаполнено( Организация) Тогда
ОператорВыбораЗакупок. Отбор. Добавить( "Закупки.Организация = &Организация" ) ;
ОператорВыбораПродаж. Отбор. Добавить( "Продажи.Организация = &Организация" ) ;
КонецЕсли ;
Если ЗначениеЗаполнено( Склад) Тогда
ОператорВыбораЗакупок. Отбор. Добавить( "Закупки.Склад = &Склад" ) ;
ОператорВыбораПродаж. Отбор. Добавить( "Продажи.Склад = &Склад" ) ;
КонецЕсли ;
ЗапросИзРегистраЦен = СхемаЗапроса. ПакетЗапросов. Добавить( ) ;
ЗапросИзРегистраЦен. ТаблицаДляПомещения = "ВТ_ЦеныНоменклатуры" ;
ОператорВыбрать = ЗапросИзРегистраЦен. Операторы[0 ];
Источник = ОператорВыбрать. Источники. Добавить( "РегистрСведений.ЦеныНоменклатуры.СрезПоследних" , "ЦеныНоменклатурыСрезПоследних" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "ЦеныНоменклатурыСрезПоследних.Номенклатура" ) ;
ОператорВыбрать. Отбор. Добавить( "ЦеныНоменклатурыСрезПоследних.Цена > &Цена" ) ;
СхемаЗапроса. ПакетЗапросов. Сдвинуть( СхемаЗапроса. ПакетЗапросов. Индекс( ЗапросИзРегистраЦен) , 0 ) ;
ОператорВыбораЗакупок. Отбор. Добавить( "Закупки.Номенклатура В (ВЫБРАТЬ ВТ_ЦеныНоменклатуры.Номенклатура ИЗ ВТ_ЦеныНоменклатуры КАК ВТ_ЦеныНоменклатуры)" ) ;
ОператорВыбораПродаж. Отбор. Добавить( "Продажи.Номенклатура В (ВЫБРАТЬ ВТ_ЦеныНоменклатуры.Номенклатура ИЗ ВТ_ЦеныНоменклатуры КАК ВТ_ЦеныНоменклатуры)" ) ;
СхемаЗапроса = Новый СхемаЗапроса;
КоллекцияОператоры = СхемаЗапроса. ПакетЗапросов[0 ]. Операторы;
Для каждого ГруппаТаблиц Из СхемаЗапроса. ПакетЗапросов[0 ]. ДоступныеТаблицы Цикл
Если ГруппаТаблиц. Представление = "Справочники"
ИЛИ ГруппаТаблиц. Представление = "ПланыСчетов"
ИЛИ ГруппаТаблиц. Представление = "ПланыВидовРасчета"
ИЛИ ГруппаТаблиц. Представление = "ПланыВидовХарактеристик" Тогда
Для каждого Таблица Из ГруппаТаблиц. Состав Цикл
Для каждого ПолеТаблицы Из Таблица. Поля Цикл
Если ПолеТаблицы. Имя = "ИмяПредопределенныхДанных" Тогда
НовыйОператор = КоллекцияОператоры. Добавить( ) ;
НовыйИсточник = НовыйОператор. Источники. Добавить( Таблица, "СправочникИмя" ) ;
НовыйОператор. ВыбираемыеПоля. Добавить( """ " + Таблица. Имя+ """ " ) ;
НовыйОператор. ВыбираемыеПоля. Добавить( "КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СправочникИмя.ИмяПредопределенныхДанных)" ) ;
НовыйОператор. Группировка. Добавить( "СправочникИмя.ИмяПредопределенныхДанных" ) ;
НовыйОператор. Отбор. Добавить( "СправочникИмя.Предопределенный" ) ;
НовыйОператор. Отбор. Добавить( "КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СправочникИмя.Ссылка) > 1" ) ;
Продолжить;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Категория:
Запросы Обход метаданных (полезные функции) При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это всё легко делается через свойство глобального контекста "Метаданные", но чтоб дорбаться до обхода реквизитов надо написать кучу вложенных циклов. При этом код становится слабочитаемым и слабомодифицируемым.
Ниже приведен небольшой модуль, который решает задачу легко и удобно. Создана специальная функция РазвернутьСтрокуОбходаМетаданных, которая может по строке типа "Метаданные.Справочники.*.Реквизиты.*" построить массив строк с перечислением всех реквизитов всех справочников. При помощи этой и нескольких других функций в экспортных функциях модуля реализованы вполне прикладные задачи - получение всех реквизитов, всех макетов, всех форм конфигурации и построение таблицы всех составных типов.
Код 1C v 8.х
Функция РазвернутьСтрокуОбходаМетаданных(СтрокаОбхода, ЗаменяемоеЗначение = "*" , ПредставлениеПоУмолчанию = "" )
Рез = Новый Массив;
ЧастиСтрокиОбхода = РазобратьСтрокуОбхода( СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Если ЧастиСтрокиОбхода = Неопределено тогда
Рез. Добавить( СтрокаОбхода) ;
Иначе
ОбъектКоллекции = Вычислить( ЧастиСтрокиОбхода. СтрокаКоллекции) ;
РазвернутаяКоллекция = РазвернутьКоллекциюВПредставления( ОбъектКоллекции, ЧастиСтрокиОбхода. СтрокаПредставление) ;
Для каждого ЭлементРазвернутойКоллекции Из РазвернутаяКоллекция Цикл
ТекущаяСтрокаОбхода = ЧастиСтрокиОбхода. СтрокаНачало + ЭлементРазвернутойКоллекции + ЧастиСтрокиОбхода. СтрокаКонец;
МассивЭлемента = РазвернутьСтрокуОбходаМетаданных( ТекущаяСтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Для каждого ПримитивныйЭлементОбхода Из МассивЭлемента Цикл
Рез. Добавить( ПримитивныйЭлементОбхода) ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
Возврат Рез;
КонецФункции
Функция РазобратьСтрокуОбхода(СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию)
Если ПустаяСтрока( ЗаменяемоеЗначение) Тогда
ВызватьИсключение "Некорректное выражение заменяемого значения" ;
КонецЕсли ;
ПозицияЗамены = Найти( СтрокаОбхода, ЗаменяемоеЗначение) ;
Если ПозицияЗамены = 0 Тогда
Возврат Неопределено ;
КонецЕсли ;
СтрокаНачало = Лев( СтрокаОбхода, ПозицияЗамены - 1 ) ;
СтрокаКоллекции = СтрокаНачало;
Если Прав( СтрокаКоллекции, 1 ) = "." Тогда
СтрокаКоллекции = Лев( СтрокаКоллекции, СтрДлина( СтрокаКоллекции) - 1 ) ;
КонецЕсли ;
ПозицияОкончанияЗамены = ПозицияЗамены + СтрДлина( ЗаменяемоеЗначение) ;
ОстатокВыражения = Сред( СтрокаОбхода, ПозицияОкончанияЗамены) ;
ОткрывающаяСкобка = "[" ;
ЗакрывающаяСкобка = "]" ;
Если Найти( ОстатокВыражения, ОткрывающаяСкобка) = 1 Тогда
ОстатокВыражения = Сред( ОстатокВыражения, СтрДлина( ОткрывающаяСкобка) + 1 ) ;
ПозицияЗакрывающейСкобки = Найти( ОстатокВыражения, ЗакрывающаяСкобка) ;
Если ПозицияЗакрывающейСкобки = 0 Тогда
ВызватьИсключение "Синтаксическая ошибка разбора выражения" ;
КонецЕсли ;
СтрокаПредставление = Лев( ОстатокВыражения, ПозицияЗакрывающейСкобки - 1 ) ;
ОстатокВыражения = Сред( ОстатокВыражения, ПозицияЗакрывающейСкобки + СтрДлина( ЗакрывающаяСкобка) ) ;
Иначе
СтрокаПредставление = ПредставлениеПоУмолчанию;
КонецЕсли ;
СтрокаКонец = ОстатокВыражения;
Рез = Новый Структура( "ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец" ,
ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец) ;
Возврат Рез;
КонецФункции
Функция РазвернутьКоллекциюВПредставления(Коллекция, Знач ПредставлениеЭлемента = "" )
Если не ПустаяСтрока( ПредставлениеЭлемента) Тогда
Если Найти( ПредставлениеЭлемента, ";" ) > 0 Тогда
ВызватьИсключение "Некорректное выражение представления" ;
КонецЕсли ;
ПредставлениеЭлемента = "." + ПредставлениеЭлемента;
КонецЕсли ;
Рез = Новый Массив;
Для каждого ЭлементКоллекции Из Коллекция Цикл
ТекПредставление = Строка( Вычислить( "ЭлементКоллекции" + ПредставлениеЭлемента) ) ;
Рез. Добавить( ТекПредставление) ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция РазвернутьМассивСтрокОбходаМетаданных(МассивСтрокОбхода, ЗаменяемоеЗначение = "*" , ПредставлениеПоУмолчанию = "Имя" )
Рез = Новый Массив;
Для каждого СтрокаОбхода Из МассивСтрокОбхода Цикл
ДополнениеРезультата = РазвернутьСтрокуОбходаМетаданных( СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Для каждого ТекСтрока Из ДополнениеРезультата Цикл
Рез. Добавить( ТекСтрока) ;
КонецЦикла ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьМассивСтрокМногострочнойСтроки(ПреобразуемаяСтрока, ИгнорироватьПустые = Истина, СокращатьПробелы = Истина)
Рез = Новый Массив;
ЧислоСтрок = СтрЧислоСтрок( ПреобразуемаяСтрока) ;
Для Сч = 1 По ЧислоСтрок Цикл
ТекСтрока = СтрПолучитьСтроку( ПреобразуемаяСтрока, Сч) ;
Если ИгнорироватьПустые и ПустаяСтрока( ТекСтрока) Тогда
Продолжить;
КонецЕсли ;
Если СокращатьПробелы Тогда
ТекСтрока = СокрЛП( ТекСтрока) ;
КонецЕсли ;
Рез. Добавить( ТекСтрока) ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьВсеХранимыеРеквизитыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.Константы.*
|Метаданные.ПланыОбмена.*.Реквизиты.*
|Метаданные.ПланыОбмена.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Справочники.*.Реквизиты.*
|Метаданные.Справочники.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Документы.*.Реквизиты.*
|Метаданные.Документы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Последовательности.*.Измерения.*
|Метаданные.ПланыВидовХарактеристик.*.Реквизиты.*
|Метаданные.ПланыВидовХарактеристик.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.ПризнакиУчета.*
|Метаданные.ПланыСчетов.*.ПризнакиУчетаСубконто.*
|Метаданные.ПланыСчетов.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.РегистрыСведений.*.Измерения.*
|Метаданные.РегистрыСведений.*.Ресурсы.*
|Метаданные.РегистрыСведений.*.Реквизиты.*
|Метаданные.РегистрыНакопления.*.Измерения.*
|Метаданные.РегистрыНакопления.*.Ресурсы.*
|Метаданные.РегистрыНакопления.*.Реквизиты.*
|Метаданные.РегистрыБухгалтерии.*.Измерения.*
|Метаданные.РегистрыБухгалтерии.*.Ресурсы.*
|Метаданные.РегистрыБухгалтерии.*.Реквизиты.*
|Метаданные.РегистрыРасчета.*.Измерения.*
|Метаданные.РегистрыРасчета.*.Ресурсы.*
|Метаданные.РегистрыРасчета.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Задачи.*.Реквизиты.*
|Метаданные.Задачи.*.РеквизитыАдресации.*
|Метаданные.Задачи.*.ТабличныеЧасти.*.Реквизиты.*
|" ;
ВсеХранимыеРеквизитыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеХранимыеРеквизитыКонфигурации;
КонецФункции
Функция ПолучитьВсеХранимыеРеквизитыКонфигурацииСоставногоТипа() Экспорт
ВсеХранимыеРеквизитыКонфигурации = ПолучитьВсеХранимыеРеквизитыКонфигурации( ) ;
Рез = Новый ТаблицаЗначений;
Рез. Колонки. Добавить( "Имя" , Новый ОписаниеТипов( "Строка" ) ) ;
Рез. Колонки. Добавить( "Тип" , Новый ОписаниеТипов( "ОписаниеТипов" ) ) ;
Рез. Колонки. Добавить( "КоличествоПростыхТипов" , Новый ОписаниеТипов( "Число" ) ) ;
Для каждого ТекРеквизит Из ВсеХранимыеРеквизитыКонфигурации Цикл
Реквизит = Вычислить( ТекРеквизит) ;
Тип = Реквизит. Тип;
КоличествоПростыхТипов = Тип. Типы( ) . Количество( ) ;
Если КоличествоПростыхТипов< > 1 Тогда
ТекСтрока = Рез. Добавить( ) ;
ТекСтрока. Имя = ТекРеквизит;
ТекСтрока. Тип = Тип;
ТекСтрока. КоличествоПростыхТипов = КоличествоПростыхТипов;
КонецЕсли ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьВсеФормыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Формы.*
|Метаданные.КритерииОтбора.*.Формы.*
|Метаданные.ОбщиеФормы.*
|Метаданные.Справочники.*.Формы.*
|Метаданные.Документы.*.Формы.*
|Метаданные.ЖурналыДокументов.*.Формы.*
|Метаданные.Перечисления.*.Формы.*
|Метаданные.Отчеты.*.Формы.*
|Метаданные.Обработки.*.Формы.*
|Метаданные.ПланыВидовХарактеристик.*.Формы.*
|Метаданные.ПланыСчетов.*.Формы.*
|Метаданные.ПланыВидовРасчета.*.Формы.*
|Метаданные.РегистрыСведений.*.Формы.*
|Метаданные.РегистрыНакопления.*.Формы.*
|Метаданные.РегистрыБухгалтерии.*.Формы.*
|Метаданные.РегистрыРасчета.*.Формы.*
|Метаданные.БизнесПроцессы.*.Формы.*
|Метаданные.Задачи.*.Формы.*
|" ;
ВсеФормыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеФормыКонфигурации;
КонецФункции
Функция ПолучитьВсеМакетыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Макеты.*
|Метаданные.ОбщиеМакеты.*
|Метаданные.Справочники.*.Макеты.*
|Метаданные.Документы.*.Макеты.*
|Метаданные.ЖурналыДокументов.*.Макеты.*
|Метаданные.Перечисления.*.Макеты.*
|Метаданные.Отчеты.*.Макеты.*
|Метаданные.Обработки.*.Макеты.*
|Метаданные.ПланыВидовХарактеристик.*.Макеты.*
|Метаданные.ПланыСчетов.*.Макеты.*
|Метаданные.ПланыВидовРасчета.*.Макеты.*
|Метаданные.РегистрыСведений.*.Макеты.*
|Метаданные.РегистрыНакопления.*.Макеты.*
|Метаданные.РегистрыБухгалтерии.*.Макеты.*
|Метаданные.РегистрыРасчета.*.Макеты.*
|Метаданные.БизнесПроцессы.*.Макеты.*
|Метаданные.Задачи.*.Макеты.*
|" ;
ВсеМакетыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеМакетыКонфигурации;
КонецФункции
Категория:
Метаданные Как получить сальдо дебетовое или кредитовое? Примеры универсальных функций 1С для
получения Конечных Сальдо Дк и Дт :
Код 1C v 8.х
знОрганизация = Организация;
КонПериода = ТекущаяДата( ) ;
Функция СКД(Счет, ДатаО = Неопределено)
Если ДатаО = Неопределено Тогда ДатаО = КонецДня( КонПериода) КонецЕсли ;
СчетПЛ = ПланыСчетов. Хозрасчетный. НайтиПоКоду( Счет) ;
Если СчетПЛ = ПланыСчетов. Хозрасчетный. ПустаяСсылка( ) Тогда
Возврат "Нет счета!" ;
КонецЕсли ;
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.СуммаОстатокДт,
| ХозрасчетныйОстатки.СуммаОстатокКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&DatO, Счет В ИЕРАРХИИ(&Scet), , Организация = &Organ) КАК ХозрасчетныйОстатки
|" ;
Запрос. УстановитьПараметр( "DatO" , Новый Граница( ДатаО, ВидГраницы. Включая) ) ;
Запрос. УстановитьПараметр( "Scet" , СчетПЛ) ;
Запрос. УстановитьПараметр( "Organ" , знОрганизация) ;
Результат = Запрос. Выполнить( ) ;
Результат = Результат. Выбрать( ) ;
Если Результат. Следующий( ) Тогда
Возврат Результат. СуммаОстатокДт;
Иначе
Возврат 0 ;
КонецЕсли ;
КонецФункции
Функция СКК(Счет, ДатаО = Неопределено)
Если ДатаО = Неопределено Тогда ДатаО = КонецДня( КонПериода) КонецЕсли ;
СчетПЛ = ПланыСчетов. Хозрасчетный. НайтиПоКоду( Счет) ;
Если СчетПЛ = ПланыСчетов. Хозрасчетный. ПустаяСсылка( ) Тогда
Возврат "Нет счета!" ;
КонецЕсли ;
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.СуммаОстатокДт,
| ХозрасчетныйОстатки.СуммаОстатокКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&DatO, Счет В ИЕРАРХИИ (&Scet), , Организация = &Organ) КАК ХозрасчетныйОстатки" ;
Запрос. УстановитьПараметр( "DatO" , Новый Граница( ДатаО, ВидГраницы. Включая) ) ;
Запрос. УстановитьПараметр( "Scet" , СчетПЛ) ;
Запрос. УстановитьПараметр( "Organ" , знОрганизация) ;
Результат = Запрос. Выполнить( ) ;
Результат = Результат. Выбрать( ) ;
Если Результат. Следующий( ) Тогда
Возврат Результат. СуммаОстатокКт;
Иначе
Возврат 0 ;
КонецЕсли ;
КонецФункции
Пример использования:
Код 1C v 8.х ТекЗнач = СКД( "04.01" ) - СКК( "05" ) + СКД( "08.05" ) ;
Категория:
Регистры бухгалтерии Пытаюсь сделать расшифровку отчета Пытаюсь сделать расшифровку отчета, в карточку счета хочу поставить отбор по своей номенклатуре, но проблема в том, что, в поле отбора встает слово номенклатура и моя номенклатура по которой я хочу сделать отбор, но оно будьто бы не доступно, сама карточка формируется без участия моего отбора. В карточке в доступных полях есть номенклатура, но выгружается туда в настройки номенклатура с красным крестом, в чем может быть дело?делаю так:
Код 1C v 8.х Если ТипЗнч( Расшифровка) = Тип( "СписокЗначений" ) Тогда
Если Расшифровка. Количество( ) = 1 Тогда
ВыбранноеЗначение = Расшифровка[0 ];
Иначе
ВыбранноеЗначение = Расшифровка. ВыбратьЭлемент( "Выберите расшифровку" , Расшифровка[0 ]) ;
КонецЕсли ;
Если ВыбранноеЗначение < > Неопределено Тогда
ВыбраннаяРасшифровка = ВыбранноеЗначение. Значение;
Иначе
СтандартнаяОбработка = Ложь ;
Возврат ;
КонецЕсли ;
ИначеЕсли ТипЗнч( Расшифровка) = Тип( "Структура" )
ИЛИ ТипЗнч( Расшифровка) = Тип( "Соответствие" ) Тогда
ВыбраннаяРасшифровка = Расшифровка;
КонецЕсли ;
Если ТипЗнч( ВыбраннаяРасшифровка) = Тип( "Структура" )
ИЛИ ТипЗнч( ВыбраннаяРасшифровка) = Тип( "Соответствие" ) Тогда
ОбщаяРасшифровка = Элемент. Область( 1 , 1 ) . Расшифровка;
Если ТипЗнч( ОбщаяРасшифровка) = Тип( "Структура" )
ИЛИ ТипЗнч( ОбщаяРасшифровка) = Тип( "Соответствие" ) Тогда
Для Каждого Элемент Из ОбщаяРасшифровка Цикл
ВыбраннаяРасшифровка. Вставить( Элемент. Ключ, Элемент. Значение) ;
КонецЦикла ;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
Отчет = Отчеты[ВыбраннаяРасшифровка["ИмяОбъекта" ]]. Создать( ) ;
Настройки = Отчет. КомпоновщикНастроек. ПолучитьНастройки( ) ;
Отчет. РежимРасшифровки = Истина ;
ФормаОтчета = Отчет. ПолучитьФорму( , , Новый УникальныйИдентификатор( ) ) ;
Отчет. НачалоПериода = ДатаНач;
Отчет. КонецПериода = ДатаКон;
Отчет. Организация = ПостроительОтчета. Отбор. Организация. Значение;
Отчет. Счет = ПланыСчетов. Хозрасчетный. Материалы;
Отчет. Настроить( ) ;
Если ВыбраннаяРасшифровка["Отбор" ] < > Неопределено Тогда
Для Каждого СтрокаОтбора Из ВыбраннаяРасшифровка["Отбор" ] Цикл
Если ТипЗнч( СтрокаОтбора. Значение) < > Тип( "Соответствие" ) Тогда
ТиповыеОтчеты. ДобавитьОтбор( Отчет. КомпоновщикНастроек, СтрокаОтбора. Ключ, СтрокаОтбора. Значение) ;
Иначе
Для Каждого Элемент Из СтрокаОтбора. Значение Цикл
ТиповыеОтчеты. ДобавитьОтбор( Отчет. КомпоновщикНастроек, Элемент. Ключ, Элемент. Значение) ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
ФормаОтчета. Открыть( ) ;
ФормаОтчета. ОбновитьОтчет( ) ;
Категория: Нет
Проведение документа по регистру бухгалтерии Задача: Есть два склада Склад1 и Склад2. Нужно переместить определенное количество товара со склада1 на склад2. При списании со склада1 нужно проверять остаток, что хватает товара. Проведение сделать по регистру бухгалтерии.(проверку тоже по регистру бухгалтерии).
Решение: В Шапке документа Склад1 и Склад2. В Табличной части номенклатура и количество.
Код 1C v 8.х Процедура ОбработкаПроведения(Отказ, Режим)
Движения. Хозрасчетный. Очистить( ) ;
Движения. Хозрасчетный. Записать( ) ;
Движения. Хозрасчетный. Записывать = Истина ;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.КоличествоОстатокДт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.Счет = &Счет
| И ХозрасчетныйОстатки.Субконто1 = &Субконто1
| И ХозрасчетныйОстатки.Субконто2 = &Субконто2" ;
Запрос. УстановитьПараметр( "Счет" , ПланыСчетов. Хозрасчетный. ТоварыНаСкладах) ;
Запрос. УстановитьПараметр( "Субконто1" , ТекСтрокаТовары. Номенклатура) ;
Запрос. УстановитьПараметр( "Субконто2" , Склад1 ) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
Если Выборка. КоличествоОстатокДт < ТекСтрокаТовары. Количество Тогда
Сообщить( "На складе1 остака: " + СокрЛП( Выборка. КоличествоОстатокДт) ) ;
Отказ = Истина ;
Возврат ;
КонецЕсли ;
Иначе
Сообщить( "нет остатка на складе1" ) ;
Отказ = Истина ;
Возврат ;
КонецЕсли ;
Движение = Движения. Хозрасчетный. Добавить( ) ;
Движение. СчетКт = ПланыСчетов. Хозрасчетный. ТоварыНаСкладах;
Движение. СчетДт = ПланыСчетов. Хозрасчетный. ТоварыНаСкладах;
Движение. Период = Дата;
Движение. КоличествоКт = ТекСтрокаТовары. Количество;
Движение. ДатаЗаписи = Дата;
Движение. Содержание = "Перемещение" ;
БухгалтерскийУчет. УстановитьСубконто( Движение. СчетКт, Движение. СубконтоКт,
"Номенклатура" , ТекСтрокаТовары. Номенклатура) ;
БухгалтерскийУчет. УстановитьСубконто( Движение. СчетКт, Движение. СубконтоКт,
"Склады" , Склад1 ) ;
БухгалтерскийУчет. УстановитьСубконто( Движение. СчетДт, Движение. СубконтоДт,
"Номенклатура" , ТекСтрокаТовары. Номенклатура) ;
БухгалтерскийУчет. УстановитьСубконто( Движение. СчетДт, Движение. СубконтоДт,
"Склады" , Склад2 ) ;
КонецЦикла ;
КонецПроцедуры
Категория:
Регистры бухгалтерии Поиск в базе битых ссылок - "объект не найден" В статье
Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID мы обсуждали как востановить битые ссылки!
А вот как найти в базе все битые ссылки, которые имеют вид типа "<Объект не найден> (137:8b270030482898d011daad3cc45fc830)"?
Для поиска этого была написана данная обработка:
Скачивать файлы может только зарегистрированный пользователь!
Для поиска: Выбираем объекты метаданных , которые хотим проверить, жмем кнопочку "Выполнить" и наблюдаем в таблице выходные данные. Откуда можем попасть в объекты-источники.
Для программиста:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ИспользоватьОграничение = ЗначениеЗаполнено( ОграничениеТипов) ;
РезультатПоиска. Очистить( ) ;
Для Каждого ОбъектыМетаданных Из КоллекцияОбъектов Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние( ОбъектМетаданных. ПолноеИмя( ) ) ;
ПроверитьОбъектНаБитыеСсылки( ОбъектМетаданных) ;
КонецЦикла ;
КонецЦикла ;
Для Каждого ОбъектыМетаданных Из КоллекцияРегистров Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние( ОбъектМетаданных. ПолноеИмя( ) ) ;
ПроверитьРегистрНаБитыеСсылки( ОбъектМетаданных) ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ВывестиДанные(ТекстЗапроса)
Запрос = Новый Запрос( ТекстЗапроса) ;
Попытка
РезультатЗапроса = Запрос. Выполнить( ) ;
Если Не РезультатЗапроса. Пустой( ) Тогда
ТЗ = РезультатЗапроса. Выгрузить( ) ;
Для Каждого Стр Из ТЗ Цикл
ОбработкаПрерыванияПользователя( ) ;
Строка = РезультатПоиска. Добавить( ) ;
ЗаполнитьЗначенияСвойств( Строка, Стр) ;
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( ИнформацияОбОшибке( ) . Описание + " " + ИнформацияОбОшибке( ) . Причина) ;
КонецПопытки ;
КонецПроцедуры
Процедура ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных. ПолноеИмя( ) ;
Если Метаданные. РегистрыСведений. Содержит( ОбъектМетаданных) Тогда
Если ОбъектМетаданных. РежимЗаписи = НезависимыйРежимЗаписи Тогда
Возврат ;
КонецЕсли ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
КонецЕсли ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Измерения, ИмяТаблицы) ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
АнализРегистратораРегистра( ОбъектМетаданных, ИмяТаблицы) ;
Если Метаданные. РегистрыБухгалтерии. Содержит( ОбъектМетаданных) Тогда
КонецЕсли ;
Если Метаданные. РегистрыРасчета. Содержит( ОбъектМетаданных) Тогда
КонецЕсли ;
КонецПроцедуры
Процедура ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных. ПолноеИмя( ) ;
АнализСвойствОбъекта( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
Для Каждого ТабЧасть Из ОбъектМетаданных. ТабличныеЧасти Цикл
Если ТабличныеЧастиИсключения. Найти( ТабЧасть. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
АнализСвойствОбъекта( ОбъектМетаданных, ТабЧасть. Реквизиты, ИмяТаблицы + "." + ТабЧасть. Имя)
КонецЦикла ;
Если Метаданные. Справочники. Содержит( ОбъектМетаданных) И ОбъектМетаданных. Владельцы. Количество( ) > 0 Тогда
МассивВладельцев = Новый Массив;
Для Каждого Элемент Из ОбъектМетаданных. Владельцы Цикл
МассивВладельцев. Добавить( Элемент) ;
КонецЦикла ;
КонецЕсли ;
ОбработкаПрерыванияПользователя( ) ;
КонецПроцедуры
Процедура АнализСвойствОбъекта(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения. Найти( Реквизит. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
Для Каждого моТип Из Реквизит. Тип. Типы( ) Цикл
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросОбъект( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит. Имя, моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура АнализСвойствРегистра(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения. Найти( Реквизит. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
Для Каждого моТип Из Реквизит. Тип. Типы( ) Цикл
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросРегистр( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит. Имя, моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы)
МассивРегистраторов = ПолучитьСписокРегистраторов( ОбъектМетаданных) ;
Для Каждого Регистратор Из МассивРегистраторов Цикл
Если РеквизитыИсключения. Найти( "Регистратор" ) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
моТип = Регистратор;
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросРегистр( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, "Регистратор" , моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Функция ПолучитьСписокРегистраторов(ОбъектМетаданных)
МассивРегистраторов = Новый Массив;
МенеджерОбъект = ПолучитьМенеджерОбъекта( ОбъектМетаданных) ;
Если МенеджерОбъект < > Неопределено Тогда
НаборЗаписей = МенеджерОбъект. СоздатьНаборЗаписей( ) ;
ЭлементОтбора = НаборЗаписей. Отбор. Регистратор;
МассивРегистраторов = ЭлементОтбора. ТипЗначения. Типы( ) ;
КонецЕсли ;
Возврат МассивРегистраторов;
КонецФункции
Функция ПолучитьМенеджерОбъекта(ОбъектМетаданных)
Перем МенеджерОбъекта;
Если Метаданные. РегистрыБухгалтерии. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыБухгалтерии[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыНакопления. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыНакопления[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыСведений. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыСведений[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыРасчета. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыРасчета[ОбъектМетаданных. Имя];
КонецЕсли ;
Возврат МенеджерОбъекта;
КонецФункции
Функция ПоискПоТипу(ИмяТипа)
Результат = Ложь ;
Если ИспользоватьОграничение Тогда
МассивСтрок = ОграничениеТипов. НайтиСтроки( Новый Структура( "ТипДанных" , ИмяТипа) ) ;
Если ЗначениеЗаполнено( МассивСтрок) Тогда
Результат = Истина ;
КонецЕсли ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Процедура ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| "" " + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Регистратор КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа( ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия( ИмяРеквизита, ТипРеквизита) ;
ТекстЗапроса = ТекстЗапроса + ? ( ПустаяСтрока( ТекстЗапроса) , "" , Символы. ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы. ПС) + Текст;
КонецПроцедуры
Процедура ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| "" " + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Ссылка КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа( ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия( ИмяРеквизита, ТипРеквизита) ;
ТекстЗапроса = ТекстЗапроса + ? ( ПустаяСтрока( ТекстЗапроса) , "" , Символы. ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы. ПС) + Текст;
КонецПроцедуры
Функция ДобавитьУсловия(ИмяРеквизита, ТипРеквизита)
мдОбъекта = Метаданные. НайтиПоТипу( ТипРеквизита) ;
ИмяТаблицы = мдОбъекта. ПолноеИмя( ) ;
ПроверкаНаПустыеЗначения = " Об." + ИмяРеквизита + " ССЫЛКА " + ИмяТаблицы;
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И ВЫРАЗИТЬ(Об." + ИмяРеквизита + " КАК " + ИмяТаблицы + ").Ссылка есть null" ;
Если Не Метаданные. Перечисления. Содержит( мдОбъекта) Тогда
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И Об." + ИмяРеквизита + " <> Значение(" + ИмяТаблицы + ".ПустаяСсылка)" ;
КонецЕсли ;
Возврат ПроверкаНаПустыеЗначения;
КонецФункции
Функция ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита)
ОбъектТипа = Метаданные. НайтиПоТипу( ТипРеквизита) ;
ИмяТаблицы = ОбъектТипа. ПолноеИмя( ) ;
ОписаниеТипа = """ " + ИмяТаблицы + """ КАК ТипДанных" ;
Возврат ОписаниеТипа;
КонецФункции
Процедура ОграничениеТиповТипДанныхНачалоВыбора(Элемент, СтандартнаяОбработка)
Перем ЭлементСписка;
СтандартнаяОбработка = Ложь ;
Строка = ЭлементыФормы. ОграничениеТипов. ТекущиеДанные;
Если Не ПустаяСтрока( Строка. ТипДанных) Тогда
ЭлементСписка = СписокТипов. НайтиПоЗначению( Строка. ТипДанных) ;
КонецЕсли ;
ВыбранныйЭлемент = СписокТипов. ВыбратьЭлемент( , ЭлементСписка) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Строка. ТипДанных = ВыбранныйЭлемент. Значение;
КонецЕсли ;
КонецПроцедуры
РеквизитыИсключения = Новый Массив;
ТабличныеЧастиИсключения = Новый Массив;
СписокТипов = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из Метаданные. Справочники Цикл
СписокТипов. Добавить( ОбъектМетаданных. ПолноеИмя( ) , ОбъектМетаданных. Имя, , БиблиотекаКартинок. СправочникОбъект) ;
КонецЦикла ;
Для Каждого ОбъектМетаданных Из Метаданные. Документы Цикл
СписокТипов. Добавить( ОбъектМетаданных. ПолноеИмя( ) , ОбъектМетаданных. Имя, , БиблиотекаКартинок. ДокументОбъект) ;
КонецЦикла ;
КоллекцияОбъектов = Новый Массив;
КоллекцияОбъектов. Добавить( Метаданные. ПланыОбмена) ;
КоллекцияОбъектов. Добавить( Метаданные. Справочники) ;
КоллекцияОбъектов. Добавить( Метаданные. Документы) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыВидовХарактеристик) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыСчетов) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыВидовРасчета) ;
КоллекцияОбъектов. Добавить( Метаданные. БизнесПроцессы) ;
КоллекцияОбъектов. Добавить( Метаданные. Задачи) ;
КоллекцияРегистров = Новый Массив;
КоллекцияРегистров. Добавить( Метаданные. РегистрыСведений) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыНакопления) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыБухгалтерии) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыРасчета) ;
Категория:
1С Общие вопросы - Обычные формы Поле выбора ~ Как ограничить список выбора? Ограничим список элементов, установив отбор в открываемой форме
Код 1C v 8.х
Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ФормаВыбора = Справочники. ПрочиеДоходыИРасходы. ПолучитьФормуВыбора( , Элемент) ;
ЭлементОтбораВидПДР = ФормаВыбора. Отбор. ВидПрочихДоходовИРасходов;
Если ЭлементОтбораВидПДР < > Неопределено Тогда
ЭлементОтбораВидПДР. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбораВидПДР. Значение = Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеВнереализационныеДоходыРасходы;
ЭлементОтбораВидПДР. Использование = Истина ;
КонецЕсли ;
ФормаВыбора. ЭлементыФормы. СправочникСписок. НастройкаОтбора. ВидПрочихДоходовИРасходов. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ" ;
СписокСчетов = Новый СписокЗначений;
СписокСчетов. ЗагрузитьЗначения( Запрос. Выполнить( ) . Выгрузить( ) . ВыгрузитьКолонку( "Ссылка" ) ) ;
ФормаВыбора = ПланыСчетов. Хозрасчетный. ПолучитьФормуВыбора( , Элемент) ;
ЭлементОтбораСсылка = ФормаВыбора. Отбор. Ссылка;
Если ЭлементОтбораСсылка < > Неопределено Тогда
ЭлементОтбораСсылка. ВидСравнения = ВидСравнения. ВСписке;
ЭлементОтбораСсылка. Значение = СписокСчетов;
ЭлементОтбораСсылка. Использование = Истина ;
КонецЕсли ;
ФормаВыбора. ЭлементыФормы. Список. НастройкаОтбора. Ссылка. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Использование выбора из списка
Код 1C v 8.х
Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ВидыПДР = Новый СписокЗначений;
ВидыПДР. Добавить( Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеВнереализационныеДоходыРасходы) ;
ВидыПДР. Добавить( Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеОперационныеДоходыРасходы) ;
ВыбранныйЭлемент = ВыбратьИзСписка( ВидыПДР, Элемент, ВидыПДР. НайтиПоЗначению( Элемент. Значение) ) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Элемент. Значение = ВыбранныйЭлемент. Значение;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
СчетаКт = Новый СписокЗначений;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПоставщиками) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПодотчетнымиЛицами) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПрочимиПоставщикамиИПодрядчиками) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыПоТекущимОперациям) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. ПрочиеДоходы) ;
ВыбранныйЭлемент = ВыбратьИзСписка( СчетаКт, Элемент, СчетаКт. НайтиПоЗначению( Элемент. Значение) ) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Элемент. Значение = ВыбранныйЭлемент. Значение;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Как добавить новый вид субконто к счету? Код 1C v 8.х ВидМенеджеры = ПланыВидовХарактеристик. ВидыСубконтоХозрасчетные. НайтиПоНаименованию( "Менеджеры" , Истина ) ;
Если ВидМенеджеры. Пустая( ) Тогда
ВидМенеджеры = ПланыВидовХарактеристик. ВидыСубконтоХозрасчетные. СоздатьЭлемент( ) ;
ВидМенеджеры. Наименование = "Менеджеры" ;
ВидМенеджеры. ТипЗначения = Новый ОписаниеТипов( "СправочникСсылка.Пользователи" ) ;
ВидМенеджеры. Записать( ) ;
КонецЕсли ;
Счет = ПланыСчетов. Хозрасчетный. НайтиПоКоду( "90.01.1" ) ;
Если ( Не Счет. Пустая( ) ) И ( Счет. ВидыСубконто. Найти( ВидМенеджеры) = Неопределено ) Тогда
ОбъектСчета = Счет. ПолучитьОбъект( ) ;
НовыйВидСубконто = ОбъектСчета. ВидыСубконто. Добавить( ) ;
НовыйВидСубконто. ВидСубконто = ВидМенеджеры;
НовыйВидСубконто. ТолькоОбороты = Истина ;
НовыйВидСубконто. Суммовой = Истина ;
ОбъектСчета. Записать( ) ;
КонецЕсли ;
Категория:
Регистры бухгалтерии Как перенести остаток со счета на счет? Код 1C v 8.х Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.СуммаОстатокДт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, ,
| Субконто1 = &Контрагент И Организация = &Организация И Субконто2 = &Договор) КАК ХозрасчетныйОстатки" ;
Запрос. УстановитьПараметр( "Период" , Период1 ) ;
Запрос. УстановитьПараметр( "Контрагент" , Контрагент) ;
Запрос. УстановитьПараметр( "Договор" , Договор) ;
Запрос. УстановитьПараметр( "Организация" , Организация) ;
Запрос. УстановитьПараметр( "Счет" , ПланыСчетов. Хозрасчетный. РасчетыСПокупателями) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
Документ = Документы. ОперацияБух. СоздатьДокумент( ) ;
Документ. Дата = РабочаяДата;
Документ. Организация = Организация;
Документ. Содержание = "Погашение дебиторской задолженности" ;
Проводка = Документ. Движения. Хозрасчетный. Добавить( ) ;
Проводка. СчетДт = ПланыСчетов. Хозрасчетный. РасчетыСПокупателями;
Проводка. СчетКт = ПланыСчетов. Хозрасчетный. ПрочиеРасходы;
Проводка. СубконтоДт. Контрагенты = Контрагент;
Проводка. СубконтоДт. Договоры = Договор;
Проводка. Сумма = Выборка. СуммаОстатокДт;
Документ. СуммаОперации = Выборка. СуммаОстатокДт;
Форма = Документ. ПолучитьФорму( ) ;
Форма. Открыть( ) ;
КонецЕсли ;
Категория:
Регистры бухгалтерии Как получить обороты по счету? Код 1C v 8.х Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| ХозрасчетныйОбороты.СуммаОборотДт,
| ХозрасчетныйОбороты.СуммаОборотКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Обороты(&НачПериода, &КонПериода, Период, Счет = &Счет, , , , ) КАК ХозрасчетныйОбороты" ;
Запрос. УстановитьПараметр( "НачПериода" , НачПериода) ;
Запрос. УстановитьПараметр( "КонПериода" , КонПериода) ;
Запрос. УстановитьПараметр( "Счет" , ПланыСчетов. Хозрасчетный. ТоварыНаСкладах) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
Категория:
Регистры бухгалтерии Как получить остаток по счету? Код 1C v 8.х Запрос = Новый Запрос;
Запрос. Текст = "
|ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1,
| ХозрасчетныйОстатки.Организация,
| ХозрасчетныйОстатки.СуммаОстаток,
| ХозрасчетныйОстатки.КоличествоОстаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК ХозрасчетныйОстатки" ;
Запрос. УстановитьПараметр( "Период" , КонецДня( ДатаОтчета) ) ;
Запрос. УстановитьПараметр( "Счет" , ПланыСчетов. Хозрасчетный. ТоварыНаСкладах) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
Категория:
Регистры бухгалтерии Как изменить, присвоить, указать Тип Значения Ячейки табличной части? Создаем табличную часть и в ней реквизит с разными типами значений:
Код 1C v 8.х
НовСтрока = ТабЧасть. Добавить( ) ;
НовСтрока. РеквизитПроизвольный = 12345 ;
НовСтрока = ТабЧасть. Добавить( ) ;
НовСтрока. РеквизитПроизвольный = "Это строка" ;
НовСтрока = ТабЧасть. Добавить( ) ;
НовСтрока. РеквизитПроизвольный = ТекущаяДата( ) ;
НовСтрока = ТабЧасть. Добавить( ) ;
НовСтрока. РеквизитПроизвольный = Истина ;
НайденСтрока = ТабЧасть. Найти( "Это строка" , "РеквизитПроизвольный" ) ;
НайденСтрока. РеквизитПроизвольный = ТекущаяДата( ) ;
Счет = ПланыСчетов. Хозрасчетный. ТоварыНаСкладе;
НайденСтрока = ТабЧасть. Найти( 12345 , "РеквизитПроизвольный" ) ;
Субконото1 = Счет. ВидыСубконто[1 ];
НайденСтрока. РеквизитПроизвольный = Субконото1 . ВидСубконто. ТипЗначения. ПривестиЗначение( ) ;
Категория:
Работа с Типами данных Поле выбора ~ Как отобрать значения выводящиеся в список выбора у элемента формы поле выбора? Использование отбора:
Функционал, который используется для интерактивного отбора в списках, можно использовать и для отбора программным способом.
Для этого нужно для
события НачалоВыбора соответствующего поля ввода определить процедуру обработки и внутри процедуры программно устанавить отбор для списка.
Далее следует пример процедуры обработки
события НачалоВыбора для поля ввода
СтатьяПДР . Реквизит (и поле ввода, соответственно)
СтатьяПДР имеет тип
СправочникСсылка.ПрочиеДоходыИРасходы . Для списка справочника «Прочие доходы и расходы» устанавливается отбор по реквизиту «Вид прочих доходов и расходов» со значением «Прочие внереализационные доходы (расходы)».
Код 1C v 8.х Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ФормаВыбора = Справочники. ПрочиеДоходыИРасходы. ПолучитьФормуВыбора( , Элемент) ;
ЭлементОтбораВидПДР = ФормаВыбора. Отбор. ВидПрочихДоходовИРасходов;
Если ЭлементОтбораВидПДР < > Неопределено Тогда
ЭлементОтбораВидПДР. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбораВидПДР. Значение = Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеВнереализационныеДоходыРасходы;
ЭлементОтбораВидПДР. Использование = Истина ;
КонецЕсли ;
ФормаВыбора. ЭлементыФормы. СправочникСписок. НастройкаОтбора. ВидПрочихДоходовИРасходов. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Обратите внимание на строку кода:
Код 1C v 8.х ФормаВыбора. ЭлементыФормы. СправочникСписок. НастройкаОтбора. ВидПрочихДоходовИРасходов. Доступность = Ложь ;
Она закрывает доступ к настройке отбора «Вид прочих доходов и расходов». Таким образом, пользователь не может отключить заданный программно отбор и имеет возможность сделать выбор значения только из ограниченного списка.
Внутри процедуры обработки события НачалоВыбора параметру СтандартнаяОбработка нужно обязательно присвоить значение Ложь. В противном случае будет открыт и ограниченный список, и стандартный список, а это, конечно, не входит в наши планы.
В следующем примере для поля ввода СчетДт типа ПланСчетовСсылка.Хозрасчетный
устанавливается отбор в виде списка счетов . Список счетов предварительно формируется с помощью запроса.
Код 1C v 8.х Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ" ;
СписокСчетов = Новый СписокЗначений;
СписокСчетов. ЗагрузитьЗначения( Запрос. Выполнить( ) . Выгрузить( ) . ВыгрузитьКолонку( "Ссылка" ) ) ;
ФормаВыбора = ПланыСчетов. Хозрасчетный. ПолучитьФормуВыбора( , Элемент) ;
ЭлементОтбораСсылка = ФормаВыбора. Отбор. Ссылка;
Если ЭлементОтбораСсылка < > Неопределено Тогда
ЭлементОтбораСсылка. ВидСравнения = ВидСравнения. ВСписке;
ЭлементОтбораСсылка. Значение = СписокСчетов;
ЭлементОтбораСсылка. Использование = Истина ;
КонецЕсли ;
ФормаВыбора. ЭлементыФормы. Список. НастройкаОтбора. Ссылка. Доступность = Ложь ;
ФормаВыбора. Открыть( ) ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Использование выбора из списка:
Выбор значения
Перечисления обычно осуществляется из маленького списка. Но даже если включить выбор из формы (это делается с помощью свойства «Быстрый выбор» поля ввода), функционал отбора для перечислений все равно неприменим.
В таком случае подходящий способ ограничения списка выбора - использование метода формы ВыбратьИзСписка. Аналогично первому способу, необходимо определить процедуру обработки события НачалоВыбора для поля ввода значения. В следующем примере для поля ввода ВидПДР типа ПеречислениеСсылка.ВидыПрочихДоходовИРасходов программно устанавливается ограниченный список выбора.
Код 1C v 8.х Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ВидыПДР = Новый СписокЗначений;
ВидыПДР. Добавить( Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеВнереализационныеДоходыРасходы) ;
ВидыПДР. Добавить( Перечисления. ВидыПрочихДоходовИРасходов. ПрочиеОперационныеДоходыРасходы) ;
ВыбранныйЭлемент = ВыбратьИзСписка( ВидыПДР, Элемент, ВидыПДР. НайтиПоЗначению( Элемент. Значение) ) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Элемент. Значение = ВыбранныйЭлемент. Значение;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Результат работы процедуры показан на рисунке. Метод ВыбратьИзСписка открывает маленький список с набором значений, переданных в процедуру в первом параметре (в примере - список значений ВидыПДР).
Пример ограничения списка выбора для перечисления в 1С 8
Пример для других агрегатных типов:
Код 1C v 8.х Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
СчетаКт = Новый СписокЗначений;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПоставщиками) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПодотчетнымиЛицами) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыСПрочимиПоставщикамиИПодрядчиками) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. РасчетыПоТекущимОперациям) ;
СчетаКт. Добавить( ПланыСчетов. Хозрасчетный. ПрочиеДоходы) ;
ВыбранныйЭлемент = ВыбратьИзСписка( СчетаКт, Элемент, СчетаКт. НайтиПоЗначению( Элемент. Значение) ) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Элемент. Значение = ВыбранныйЭлемент. Значение;
КонецЕсли ;
СтандартнаяОбработка = Ложь ;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Документ "Корректировка записей регистров" - Как программно создать и заполнить? Документ «Корректировка записей регистров» в типовых конфигурациях 1С предназначен для ручной корректировки записей регистров накопления, зависимых регистров сведений и регистров бухгалтерии. Типичные ситуации, в которых может понадобиться документ «Корректировка записей регистров», - ввод начальных остатков, исправление ошибок в учете, отражение в учете операций, для которых в конфигурации нет специальных документов. В документе есть сервис автоматического заполнения движений с предопределенным действием «Сторно движений документа». С его помощь можно автоматически создать движения по регистрам бухгалтерии и регистрам накопления, аналогичные движениям указанного документа, но с отрицательными значениями.
Иногда количество вводимых записей по регистрам может быть велико и тогда целесообразно выполнить корректировку регистров программно. Документ «Корректировка записей регистров», как Вы уже, наверно, догадались, не совсем обычный. А иначе бы о нем не стоило и писать.
В качестве примера, когда может потребоваться программно создать документ «Корректировка записей регистров», предлагаю рассмотреть операцию переоценки основных средств. Переоценка основных средств - ситуация хоть и нечастая, но все же вполне реальная, а специального документа для переоценки в типовых конфигурациях 1С нет. Чтобы пример получился более представительным (включал в себя все виды корректируемых регистров), я сделал обработку для конфигурации «1С:Управление производственным предприятием». Но с другой стороны, чтобы не перегружать пример лишней информацией, мы рассмотрим случай, когда в результате переоценки происходит увеличение стоимости основных средств и накопленной амортизации (дооценка).
В этом случае переоценка основных средств отражается в бухгалтерском учете проводками:
* Дт. 01.01. - Кт. 83.01 - Увеличение первоначальной стоимости ОС.
* Дт. 83.01. - Кт. 02.01 - Увеличение суммы накопленной амортизации ОС.
В налоговом учете операция переоценки основных средств не предусмотрена, но для того чтобы соблюдалось равенство БУ = НУ + ПР + ВР, мы должны отразить в учете возникновение постоянных разниц. Также мы должны сделать движения в регистрах накопления «СтоимостьОС», «СтоимостьОСБухгалтерскийУчет» и в регистрах сведений «ПараметрыАмортизацииОС», «ПараметрыАмортизацииОСБухгалтерскийУчет», «СобытияОС» и «СобытияОСОрганизаций».
Исходные данные для переоценки ОС берутся из dbf-таблицы с набором полей:
* OS (строка) - код основного средства;
* SumU (число) - сумма дооценки по управленческому учету в единицах валюты управленческого учета;
* SumB (число) - сумма дооценки по бухгалтерскому учету;
* AmortU (число) - сумма дооценки накопленной амортизации по управленческому учету в единицах валюты управленческого учета;
* AmortB (число) - сумма дооценки накопленной амортизации по бухгалтерскому учету.
Упрощенный фрагмент кода обработки, иллюстрирующий запись проводок в регистр бухгалтерии, представлен в листинге:
Код 1C v 8.х Сч01 _01 = ПланыСчетов. Хозрасчетный. ОСвОрганизации;
Сч02 _01 = ПланыСчетов. Хозрасчетный. АмортизацияОС_01;
Сч83 _01 = ПланыСчетов. Хозрасчетный. ПриростСтоимостиИмуществаПоПереоценке;
ДБФ = Новый XBase;
ДБФ. ОткрытьФайл( ИмяФайла) ;
Если ДБФ. Открыта( ) Тогда
Попытка
НачатьТранзакцию( ) ;
ДокКорректировка = Документы. КорректировкаЗаписейРегистров. СоздатьДокумент( ) ;
ЗаполнениеДокументов. ЗаполнитьШапкуДокумента( ДокКорректировка. ЭтотОбъект, ПараметрыСеанса. ТекущийПользователь) ;
ДокКорректировка. Дата = Период;
НоваяСтрокаРегБух = ДокКорректировка. ТаблицаРегистровБухгалтерии. Добавить( ) ;
НоваяСтрокаРегБух. Имя = "Хозрасчетный" ;
НоваяСтрокаРегБух. Представление = "Журнал проводок (бухгалтерский учет)" ;
ДокКорректировка. Записать( ) ;
ДокКорректировкаСсылка = ДокКорректировка. Ссылка;
НЗХозрасчетный = РегистрыБухгалтерии. Хозрасчетный. СоздатьНаборЗаписей( ) ;
НЗХозрасчетный. Отбор. Регистратор. Значение = ДокКорректировкаСсылка;
ДБФ. Первая( ) ;
Пока Не ДБФ. ВКонце( ) Цикл
ОсновноеСредство = Справочники. ОсновныеСредства. НайтиПоКоду( СокрЛП( ДБФ. OS) ) ;
Если ОсновноеСредство. Пустая( ) Тогда
Сообщить( "Не найдено ОС с кодом " + ДБФ. OS + "!" , СтатусСообщения. Важное) ;
Продолжить;
КонецЕсли ;
ЗХозрасчетный = НЗХозрасчетный. Добавить( ) ;
ЗХозрасчетный. Период = Период;
ЗХозрасчетный. Регистратор = ДокКорректировкаСсылка;
ЗХозрасчетный. Организация = Организация;
ЗХозрасчетный. Содержание = "Увеличение первоначальной стоимости ОС" ;
ЗХозрасчетный. СчетДт = Сч01 _01;
ЗХозрасчетный. СчетКт = Сч83 _01;
БухгалтерскийУчет. УстановитьСубконто( ЗХозрасчетный. СчетДт, ЗХозрасчетный. СубконтоДт, "ОсновныеСредства" , ОсновноеСредство) ;
БухгалтерскийУчет. УстановитьСубконто( ЗХозрасчетный. СчетКт, ЗХозрасчетный. СубконтоКт, "ОсновныеСредства" , ОсновноеСредство) ;
ЗХозрасчетный. Сумма = ДБФ. SumB;
ЗХозрасчетный = НЗХозрасчетный. Добавить( ) ;
ЗХозрасчетный. Период = Период;
ЗХозрасчетный. Регистратор = ДокКорректировкаСсылка;
ЗХозрасчетный. Организация = Организация;
ЗХозрасчетный. Содержание = "Увеличение накопленной амортизации ОС" ;
ЗХозрасчетный. СчетДт = Сч83 _01;
ЗХозрасчетный. СчетКт = Сч02 _01;
БухгалтерскийУчет. УстановитьСубконто( ЗХозрасчетный. СчетДт, ЗХозрасчетный. СубконтоДт, "ОсновныеСредства" , ОсновноеСредство) ;
БухгалтерскийУчет. УстановитьСубконто( ЗХозрасчетный. СчетКт, ЗХозрасчетный. СубконтоКт, "ОсновныеСредства" , ОсновноеСредство) ;
ЗХозрасчетный. Сумма = ДБФ. AmortB;
ДБФ. Следующая( ) ;
КонецЦикла ;
ДБФ. ЗакрытьФайл( ) ;
НЗХозрасчетный. Записать( ) ;
ЗафиксироватьТранзакцию( ) ;
Исключение
Сообщить( ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
ОтменитьТранзакцию( ) ;
КонецПопытки ;
КонецЕсли ;
Как видно из примера, документ «Корректировка записей регистров» используется в качестве регистратора, движения же записываются непосредственно в регистр. Движения по регистрам накопления и регистрам сведений делаются аналогично.
Смотрите так же:
Корректировка регистров накопления через документ
Источник Категория:
Документы Как установить значение Субконто Код 1C v 8.х Процедура УстановитьСубконто(Счет, Субконто, ИмяСубконто, ЗначениеСубконто) Экспорт
Если Счет = Неопределено ИЛИ Счет. Пустая( ) Тогда
Возврат ;
КонецЕсли ;
Если ТипЗнч( ИмяСубконто) = Тип( "Число" ) Тогда
Если ИмяСубконто > Счет. ВидыСубконто. Количество( ) Тогда
Возврат ;
КонецЕсли ;
ВидСубк = Счет. ВидыСубконто[ИмяСубконто - 1 ]. ВидСубконто;
Иначе
ВидСубк = ПланыВидовХарактеристик[Метаданные. НайтиПоТипу( ТипЗнч( Счет) ) . ВидыСубконто. Имя][ИмяСубконто];
Если Счет. ВидыСубконто. Найти( ВидСубк) = Неопределено Тогда
Возврат ;
КонецЕсли ;
КонецЕсли ;
Если ВидСубк. ТипЗначения. СодержитТип( ТипЗнч( ЗначениеСубконто) ) Тогда
Субконто. Вставить( ВидСубк, ЗначениеСубконто) ;
Иначе
Сообщить( "Неверное значение "" " + ЗначениеСубконто + """ для вида субконто <" + ВидСубк + ">" ) ;
КонецЕсли ;
КонецПроцедуры
Пример использования:
Код 1C v 8.х
Проводка = Движения. Международный. Добавить( ) ;
Проводка. Период = ДатаЗакрытияПериода;
Проводка. СчетДт = Выборка. Счет;
Проводка. СчетКт = ПланыСчетов. Международный. СуммарныеДоходыИРасходы;
Проводка. Организация = Организация;
Проводка. Сумма = Выборка. СуммаОстатокКт;
Проводка. Содержание = "Закрытие счетов в конце финансового года" ;
Проводка. НомерЖурнала = "Рег" ;
НомерСубконто = 0 ;
Для каждого ВидСубконто Из Проводка. СчетДт. ВидыСубконто Цикл
НомерСубконто = НомерСубконто + 1 ;
ЗначениеСубконто = Выборка["Субконто" + НомерСубконто];
Если ЗначениеЗаполнено( ЗначениеСубконто) Тогда
УстановитьСубконто( Проводка. СчетДт, Проводка. СубконтоДт, НомерСубконто, ЗначениеСубконто) ;
КонецЕсли ;
КонецЦикла ;
Категория:
Регистры бухгалтерии