Как удалить движения документа программно? Потребовалось в УТ быстро удалить все движения по банку, дело вроде легкое - отменить проведение всех поступлений и списаний безналичных денежных средств, но не тут то было...
При попытке отмены проведения выполнялись проверки на условия оплаты по заказу и документ ни как не отменял проведения
Ну не может типовым способом, заставим не типовым: Через запрос делаем выбору необходимых нам документов и в обработке результата пишем:
Код 1C v 8.3 Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
ДокОбъект = СтрокаРезультата. Ссылка. ПолучитьОбъект( ) ;
Для Каждого Движение ИЗ ДокОбъект. Движения Цикл
Если Движение. Количество( ) > 0 Тогда
Точка = Найти( Строка( Движение) , "." ) ;
ВидРегистра = Лев( Строка( Движение) , Точка - 13 ) ;
РегистрИмя = СокрП( Сред( Строка( Движение) , Точка + 1 ) ) ;
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя]. СоздатьНаборЗаписей( ) ;
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя]. СоздатьНаборЗаписей( ) ;
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя]. СоздатьНаборЗаписей( ) ;
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя]. СоздатьНаборЗаписей( ) ;
КонецЕсли ;
НаборЗаписей. Отбор. Регистратор. Установить( ДокОбъект. Ссылка) ;
Иначе
НаборЗаписей = Движение;
КонецЕсли ;
Попытка
НаборЗаписей. Записать( ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
КонецПопытки ;
КонецЦикла ;
ДокОбъект. Проведен = Ложь ;
ДокОбъект. Записать( режимзаписидокумента. запись) ;
КонецЦикла ;
Готовая функция для использования в своих обработках или общем модуле:
Код 1C v 8.3 Процедура УдалитьДвиженияДокумента(Документ)
ДокОбъект = Документ. ПолучитьОбъект( ) ;
Для Каждого Движение ИЗ ДокОбъект. Движения Цикл
Если Движение. Количество( ) > 0 Тогда
Точка = Найти( Строка( Движение) , "." ) ;
ВидРегистра = Лев( Строка( Движение) , Точка - 13 ) ;
РегистрИмя = СокрП( Сред( Строка( Движение) , Точка + 1 ) ) ;
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя]. СоздатьНаборЗаписей( ) ;
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя]. СоздатьНаборЗаписей( ) ;
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя]. СоздатьНаборЗаписей( ) ;
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя]. СоздатьНаборЗаписей( ) ;
КонецЕсли ;
НаборЗаписей. Отбор. Регистратор. Установить( ДокОбъект. Ссылка) ;
Иначе
НаборЗаписей = Движение;
КонецЕсли ;
Попытка
НаборЗаписей. Записать( ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
КонецПопытки ;
КонецЦикла ;
КонецПроцедуры
Категория:
Документы Обход метаданных (полезные функции) При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это всё легко делается через свойство глобального контекста "Метаданные", но чтоб дорбаться до обхода реквизитов надо написать кучу вложенных циклов. При этом код становится слабочитаемым и слабомодифицируемым.
Ниже приведен небольшой модуль, который решает задачу легко и удобно. Создана специальная функция РазвернутьСтрокуОбходаМетаданных, которая может по строке типа "Метаданные.Справочники.*.Реквизиты.*" построить массив строк с перечислением всех реквизитов всех справочников. При помощи этой и нескольких других функций в экспортных функциях модуля реализованы вполне прикладные задачи - получение всех реквизитов, всех макетов, всех форм конфигурации и построение таблицы всех составных типов.
Код 1C v 8.х
Функция РазвернутьСтрокуОбходаМетаданных(СтрокаОбхода, ЗаменяемоеЗначение = "*" , ПредставлениеПоУмолчанию = "" )
Рез = Новый Массив;
ЧастиСтрокиОбхода = РазобратьСтрокуОбхода( СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Если ЧастиСтрокиОбхода = Неопределено тогда
Рез. Добавить( СтрокаОбхода) ;
Иначе
ОбъектКоллекции = Вычислить( ЧастиСтрокиОбхода. СтрокаКоллекции) ;
РазвернутаяКоллекция = РазвернутьКоллекциюВПредставления( ОбъектКоллекции, ЧастиСтрокиОбхода. СтрокаПредставление) ;
Для каждого ЭлементРазвернутойКоллекции Из РазвернутаяКоллекция Цикл
ТекущаяСтрокаОбхода = ЧастиСтрокиОбхода. СтрокаНачало + ЭлементРазвернутойКоллекции + ЧастиСтрокиОбхода. СтрокаКонец;
МассивЭлемента = РазвернутьСтрокуОбходаМетаданных( ТекущаяСтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Для каждого ПримитивныйЭлементОбхода Из МассивЭлемента Цикл
Рез. Добавить( ПримитивныйЭлементОбхода) ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
Возврат Рез;
КонецФункции
Функция РазобратьСтрокуОбхода(СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию)
Если ПустаяСтрока( ЗаменяемоеЗначение) Тогда
ВызватьИсключение "Некорректное выражение заменяемого значения" ;
КонецЕсли ;
ПозицияЗамены = Найти( СтрокаОбхода, ЗаменяемоеЗначение) ;
Если ПозицияЗамены = 0 Тогда
Возврат Неопределено ;
КонецЕсли ;
СтрокаНачало = Лев( СтрокаОбхода, ПозицияЗамены - 1 ) ;
СтрокаКоллекции = СтрокаНачало;
Если Прав( СтрокаКоллекции, 1 ) = "." Тогда
СтрокаКоллекции = Лев( СтрокаКоллекции, СтрДлина( СтрокаКоллекции) - 1 ) ;
КонецЕсли ;
ПозицияОкончанияЗамены = ПозицияЗамены + СтрДлина( ЗаменяемоеЗначение) ;
ОстатокВыражения = Сред( СтрокаОбхода, ПозицияОкончанияЗамены) ;
ОткрывающаяСкобка = "[" ;
ЗакрывающаяСкобка = "]" ;
Если Найти( ОстатокВыражения, ОткрывающаяСкобка) = 1 Тогда
ОстатокВыражения = Сред( ОстатокВыражения, СтрДлина( ОткрывающаяСкобка) + 1 ) ;
ПозицияЗакрывающейСкобки = Найти( ОстатокВыражения, ЗакрывающаяСкобка) ;
Если ПозицияЗакрывающейСкобки = 0 Тогда
ВызватьИсключение "Синтаксическая ошибка разбора выражения" ;
КонецЕсли ;
СтрокаПредставление = Лев( ОстатокВыражения, ПозицияЗакрывающейСкобки - 1 ) ;
ОстатокВыражения = Сред( ОстатокВыражения, ПозицияЗакрывающейСкобки + СтрДлина( ЗакрывающаяСкобка) ) ;
Иначе
СтрокаПредставление = ПредставлениеПоУмолчанию;
КонецЕсли ;
СтрокаКонец = ОстатокВыражения;
Рез = Новый Структура( "ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец" ,
ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец) ;
Возврат Рез;
КонецФункции
Функция РазвернутьКоллекциюВПредставления(Коллекция, Знач ПредставлениеЭлемента = "" )
Если не ПустаяСтрока( ПредставлениеЭлемента) Тогда
Если Найти( ПредставлениеЭлемента, ";" ) > 0 Тогда
ВызватьИсключение "Некорректное выражение представления" ;
КонецЕсли ;
ПредставлениеЭлемента = "." + ПредставлениеЭлемента;
КонецЕсли ;
Рез = Новый Массив;
Для каждого ЭлементКоллекции Из Коллекция Цикл
ТекПредставление = Строка( Вычислить( "ЭлементКоллекции" + ПредставлениеЭлемента) ) ;
Рез. Добавить( ТекПредставление) ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция РазвернутьМассивСтрокОбходаМетаданных(МассивСтрокОбхода, ЗаменяемоеЗначение = "*" , ПредставлениеПоУмолчанию = "Имя" )
Рез = Новый Массив;
Для каждого СтрокаОбхода Из МассивСтрокОбхода Цикл
ДополнениеРезультата = РазвернутьСтрокуОбходаМетаданных( СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Для каждого ТекСтрока Из ДополнениеРезультата Цикл
Рез. Добавить( ТекСтрока) ;
КонецЦикла ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьМассивСтрокМногострочнойСтроки(ПреобразуемаяСтрока, ИгнорироватьПустые = Истина, СокращатьПробелы = Истина)
Рез = Новый Массив;
ЧислоСтрок = СтрЧислоСтрок( ПреобразуемаяСтрока) ;
Для Сч = 1 По ЧислоСтрок Цикл
ТекСтрока = СтрПолучитьСтроку( ПреобразуемаяСтрока, Сч) ;
Если ИгнорироватьПустые и ПустаяСтрока( ТекСтрока) Тогда
Продолжить;
КонецЕсли ;
Если СокращатьПробелы Тогда
ТекСтрока = СокрЛП( ТекСтрока) ;
КонецЕсли ;
Рез. Добавить( ТекСтрока) ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьВсеХранимыеРеквизитыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.Константы.*
|Метаданные.ПланыОбмена.*.Реквизиты.*
|Метаданные.ПланыОбмена.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Справочники.*.Реквизиты.*
|Метаданные.Справочники.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Документы.*.Реквизиты.*
|Метаданные.Документы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Последовательности.*.Измерения.*
|Метаданные.ПланыВидовХарактеристик.*.Реквизиты.*
|Метаданные.ПланыВидовХарактеристик.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.ПризнакиУчета.*
|Метаданные.ПланыСчетов.*.ПризнакиУчетаСубконто.*
|Метаданные.ПланыСчетов.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.РегистрыСведений.*.Измерения.*
|Метаданные.РегистрыСведений.*.Ресурсы.*
|Метаданные.РегистрыСведений.*.Реквизиты.*
|Метаданные.РегистрыНакопления.*.Измерения.*
|Метаданные.РегистрыНакопления.*.Ресурсы.*
|Метаданные.РегистрыНакопления.*.Реквизиты.*
|Метаданные.РегистрыБухгалтерии.*.Измерения.*
|Метаданные.РегистрыБухгалтерии.*.Ресурсы.*
|Метаданные.РегистрыБухгалтерии.*.Реквизиты.*
|Метаданные.РегистрыРасчета.*.Измерения.*
|Метаданные.РегистрыРасчета.*.Ресурсы.*
|Метаданные.РегистрыРасчета.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Задачи.*.Реквизиты.*
|Метаданные.Задачи.*.РеквизитыАдресации.*
|Метаданные.Задачи.*.ТабличныеЧасти.*.Реквизиты.*
|" ;
ВсеХранимыеРеквизитыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеХранимыеРеквизитыКонфигурации;
КонецФункции
Функция ПолучитьВсеХранимыеРеквизитыКонфигурацииСоставногоТипа() Экспорт
ВсеХранимыеРеквизитыКонфигурации = ПолучитьВсеХранимыеРеквизитыКонфигурации( ) ;
Рез = Новый ТаблицаЗначений;
Рез. Колонки. Добавить( "Имя" , Новый ОписаниеТипов( "Строка" ) ) ;
Рез. Колонки. Добавить( "Тип" , Новый ОписаниеТипов( "ОписаниеТипов" ) ) ;
Рез. Колонки. Добавить( "КоличествоПростыхТипов" , Новый ОписаниеТипов( "Число" ) ) ;
Для каждого ТекРеквизит Из ВсеХранимыеРеквизитыКонфигурации Цикл
Реквизит = Вычислить( ТекРеквизит) ;
Тип = Реквизит. Тип;
КоличествоПростыхТипов = Тип. Типы( ) . Количество( ) ;
Если КоличествоПростыхТипов< > 1 Тогда
ТекСтрока = Рез. Добавить( ) ;
ТекСтрока. Имя = ТекРеквизит;
ТекСтрока. Тип = Тип;
ТекСтрока. КоличествоПростыхТипов = КоличествоПростыхТипов;
КонецЕсли ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьВсеФормыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Формы.*
|Метаданные.КритерииОтбора.*.Формы.*
|Метаданные.ОбщиеФормы.*
|Метаданные.Справочники.*.Формы.*
|Метаданные.Документы.*.Формы.*
|Метаданные.ЖурналыДокументов.*.Формы.*
|Метаданные.Перечисления.*.Формы.*
|Метаданные.Отчеты.*.Формы.*
|Метаданные.Обработки.*.Формы.*
|Метаданные.ПланыВидовХарактеристик.*.Формы.*
|Метаданные.ПланыСчетов.*.Формы.*
|Метаданные.ПланыВидовРасчета.*.Формы.*
|Метаданные.РегистрыСведений.*.Формы.*
|Метаданные.РегистрыНакопления.*.Формы.*
|Метаданные.РегистрыБухгалтерии.*.Формы.*
|Метаданные.РегистрыРасчета.*.Формы.*
|Метаданные.БизнесПроцессы.*.Формы.*
|Метаданные.Задачи.*.Формы.*
|" ;
ВсеФормыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеФормыКонфигурации;
КонецФункции
Функция ПолучитьВсеМакетыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Макеты.*
|Метаданные.ОбщиеМакеты.*
|Метаданные.Справочники.*.Макеты.*
|Метаданные.Документы.*.Макеты.*
|Метаданные.ЖурналыДокументов.*.Макеты.*
|Метаданные.Перечисления.*.Макеты.*
|Метаданные.Отчеты.*.Макеты.*
|Метаданные.Обработки.*.Макеты.*
|Метаданные.ПланыВидовХарактеристик.*.Макеты.*
|Метаданные.ПланыСчетов.*.Макеты.*
|Метаданные.ПланыВидовРасчета.*.Макеты.*
|Метаданные.РегистрыСведений.*.Макеты.*
|Метаданные.РегистрыНакопления.*.Макеты.*
|Метаданные.РегистрыБухгалтерии.*.Макеты.*
|Метаданные.РегистрыРасчета.*.Макеты.*
|Метаданные.БизнесПроцессы.*.Макеты.*
|Метаданные.Задачи.*.Макеты.*
|" ;
ВсеМакетыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеМакетыКонфигурации;
КонецФункции
Категория:
Метаданные Функция проверки необходимости перерасчета и Перерасчет записей Код 1C v 8.х
Функция НеобходимостьПерерасчета(Регистратор) Экспорт
Запрос = Новый Запрос( "ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
|ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо КАК ФизЛицо
| ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
| ИЗ
|РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор) КАК Перерасчет" ) ;
Запрос. УстановитьПараметр( "Регистратор" , Регистратор) ; Если Запрос. Выполнить( ) . Пустой( ) Тогда
Возврат Ложь ;
Иначе
Возврат Истина ;
КонецЕсли ;
КонецФункции
Данная функция возвращает значение Истина, если хотя бы в одной из таблиц перерасчета есть хотя бы одна запись по данному документу. Если таких записей нет, то функция вернет значение Ложь, и перерассчитывать записи этого документа не нужно.
Собственно перерасчет записей, как и их расчет, рекомендуется выполнять в процедуре общего модуля по тем же причинам, что и расчет. Процедура перерасчета отличается от процедуры расчета только тем, что в расчете участвуют не все записи документа, а только удовлетворяющие усло- виям проводимого перерасчета. Например, только записи по конкретным сотрудникам и конкретным видам расчета.
Наконец, после того как нужные записи перерассчитаны, необхо- димо средствами встроенного языка удалить соответствующие записи из таблицы перерасчета, так как перерасчет больше не требуется.
Процедуру перерасчета записей документа рекомендуется помещать в модуле этого документа как экспортную процедуру. В этом случае она может быть вызвана из других модулей, в том числе из обработки перерасчета, описанной в предыдущем разделе. В качестве параметров в процедуру должна передаваться информация о том, какие именно записи документа необходимо перерассчитать. Ниже приведен пример такой процедуры, где в качестве параметра используется список сотрудников, по которым необходимо выполнить перерасчет.
Процедура перерасчета записей документа
Код 1C v 8.х Процедура Перерассчитать(Физлица = Неопределено) Экспорт
Если Не Расчеты. НеобходимостьПерерасчета( Ссылка) Тогда
Возврат ; КонецЕсли ;
Расчеты. ПерерассчитатьЗаписиРегистраРасчета( "ОсновныеНачисленияРегл" , Движения. ОсновныеНачисленияРегл, ОсновныеНачисления, Физлица) ;
Движения. ОсновныеНачисленияРегл. Записать( Истина , Истина ) ;
Расчеты. ПерерассчитатьЗаписиРегистраРасчета( "ДополнительныеНачисленияРегл" , Движения. ДополнительныеНачисленияРегл, ДополнительныеНачисления, Физлица) ;
Движения. ДополнительныеНачисленияРегл. Записать( Истина , Истина ) ;
Если Н = 1 Тогда
НаборЗаписей = РегистрыРасчета. ОсновныеНачисленияРегл.
Перерасчеты. ПерерасчетОсновныхНачислений. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Записать( ) ; КонецЦикла ;
КонецПроцедуры
Процедуры общего модуля, выполняющие непосредственный перерасчет записей, по алгоритму схожи с процедурами расчета. Основное отличие состоит в том, что в процедурах перерасчета происходит расчет только тех записей, которые удовлетворяют заданным условиям. В данном случае это записи по заданному списку сотрудников. Также при перерасчете не нужно производить предварительную запись набора с формированием фактического периода действия, так как набор уже записан в регистр (перерассчитываемый документ всегда проведен). Ниже приведен пример процедур
ПерерассчитатьЗаписиРегистраРасчета() и ПерерассчитатьНаборЗаписей() . Эти процедуры используют вызов тех же самых процедур и функций, которые используются при расчете.
Процедуры перерасчета записей
Код 1C v 8.х Процедура ПерерассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабличнаяЧасть = Неопределено, ФизЛица = Неопределено)
Для каждого Запись из НаборЗаписей Цикл
Если Запись. ВидРасчета. Приоритет = Приоритет Тогда
Если НЕ ФизЛица. НайтиПоЗначению( Запись. Физлицо) = Неопределено Тогда
ДанныеДляРасчета = ПолучитьДанныеДляРасчета( Запись) ;
Иначе
НаборЗаписей = РегистрыРасчета. ДополнительныеНачисленияРегл.
Перерасчеты. ПерерасчетДополнительныхНачислений. СоздатьНаборЗаписей( ) ;
КонецЕсли ;
НаборЗаписей. Отбор. ОбъектПерерасчета. Значение = Ссылка; Если Физлица < > НеОпределено Тогда
НаборЗаписей. Прочитать( ) ; СтрокиКУдалению = Новый Массив;
Для Каждого СтрокаПерерасчета из НаборЗаписей Цикл
Если Физлица. НайтиПоЗначению( СтрокаПерерасчета. Физлицо) < > НеОпределено Тогда СтрокиКУдалению. Добавить( СтрокаПерерасчета) ;
КонецЕсли ; КонецЦикла ;
Для Каждого Строка Из СтрокиКУдалению Цикл
НаборЗаписей. Удалить( Строка) ; КонецЦикла ;
КонецЕсли ;
СтрокаТабличнойЧасти = ТабличнаяЧасть. Получить( Запись. НомерСтроки- 1 ) ;
СтрокаТабличнойЧасти. Результат = Запись. Результат; КонецЕсли ;
КонецЕсли ; КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Процедура ПерерассчитатьЗаписиРегистраРасчета(ИмяРегистра,
НаборЗаписей, ТабличнаяЧасть = Неопределено, Физлица = Неопределено) Экспорт
Регистратор = НаборЗаписей. Отбор. Регистратор. Значение;
Запрос = Новый Запрос; Запрос. Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + ИмяРегистра + ".ВидРасчета.Приоритет КАК Приоритет
|ИЗ
| РегистрРасчета." + ИмяРегистра + " КАК " + ИмяРегистра + "
|ГДЕ
| ФизЛицо В (&СписокФизлиц) И Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| Приоритет
|ИТОГИ ПО
| " + ИмяРегистра + ".ВидРасчета.Приоритет" ;
Запрос. УстановитьПараметр( "СписокФизлиц" , Физлица) ; Запрос. УстановитьПараметр( "Регистратор" , Регистратор) ;
ВыборкаПриоритетов = Запрос. Выполнить( ) .
Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
ПерерассчитатьНаборЗаписей( НаборЗаписей, ВыборкаПриоритетов. Приоритет, ТабличнаяЧасть, Физлица) ;
КонецЦикла ;
КонецПроцедуры
Категория:
Регистры расчета Формирование записей перерасчета Код 1C v 8.х
Процедура СформироватьЗаписиПерерасчета()
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| СдельнаяВыработка.ФизЛицо,
| СдельнаяВыработка.Организация,
| ОсновныеНачисленияРегл.Регистратор,
| ОсновныеНачисленияРегл.ВидРасчета
|ИЗ
| РегистрНакопления.СдельнаяВыработка КАК СдельнаяВыработка
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрРасчета.ОсновныеНачисленияРегл КАК ОсновныеНачисленияРегл
| ПО СдельнаяВыработка.ФизЛицо = ОсновныеНачисленияРегл.ФизЛицо
| И СдельнаяВыработка.Организация = ОсновныеНачисленияРегл.Организация
| И (СдельнаяВыработка.Период МЕЖДУ
| ОсновныеНачисленияРегл.ПериодДействияНачало
| И ОсновныеНачисленияРегл.ПериодДействияКонец)
|ГДЕ
| ОсновныеНачисленияРегл.ВидРасчета = &ВидРасчета
| И СдельнаяВыработка.Регистратор = &Регистратор
|ИТОГИ ПО
| Регистратор");
Запрос. УстановитьПараметр( "ВидРасчета" , ПланыВидовРасчета. ОсновныеНачисления. Сдельный) ;
Запрос. УстановитьПараметр( "Регистратор" , Ссылка) ;
ВыборкаДокументов = Запрос. Выполнить( ) .
Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
Перерасчет = РегистрыРасчета. ОсновныеНачисленияРегл.
Перерасчеты. ПерерасчетОсновныхНачислений;
Пока ВыборкаДокументов. Следующий( ) Цикл
НаборЗаписей = Перерасчет. СоздатьНаборЗаписей( ) ; НаборЗаписей. Отбор. ОбъектПерерасчета. Значение = ВыборкаДокументов. Регистратор;
Выборка = ВыборкаДокументов. Выбрать( ) ;
Запись = НаборЗаписей. Добавить( ) ; Запись. ВидРасчета = Выборка. ВидРасчета; Запись. Организация = Выборка. Организация; Запись. ФизЛицо = Выборка. ФизЛицо;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Категория:
Регистры расчета Классификация записей по приоритету видов расчета Расчет записей одного документа необходимо производить в последовательности, определяемой приоритетом видов расчета, участвующих в этих записях. Поэтому исходный набор записей должен быть разбит на несколько поднаборов, в каждом из которых будут записи одного приоритета. Затем необходимо последовательно рассчитать записи каждого из поднаборов, записав результат расчета в регистр. Запись каждого рассчитанного поднабора необходима для формирования базы расчета следующих по приоритету поднаборов.
Ниже приведен пример процедуры, которая классифицирует записи исходного набора по приоритету видов расчета и для каждого уровня приоритета вызывает процедуру расчета поднабора записей. В данном случае из набора записей выгружается массив видов расчета, после чего по этим видам расчета строится запрос с иерархией по приоритету.
Расчет записей по приоритету видов расчета
Код 1C v 8.х Процедура РассчитатьЗаписиРегистраРасчета(ИмяРегистра, НаборЗаписей, ТабличнаяЧасть = Неопределено) Экспорт
НаборЗаписей. Записать( Истина , Ложь ) ;
Метаданные. РегистрыРасчета[ИмяРегистра]. ПланВидовРасчета. Имя;
МассивВидовРасчета = ТаблицаВидовРасчета. ВыгрузитьКолонку( "ВидРасчета" ) ;
Запрос. Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Приоритет
|ИЗ
| ПланВидовРасчета." + ИмяПланаВидовРасчета + " КАК " +
| ИмяПланаВидовРасчета + "
|ГДЕ
| Ссылка В (&МассивВидовРасчета)
|УПОРЯДОЧИТЬ ПО
| " + ИмяПланаВидовРасчета + ".Приоритет
|ИТОГИ ПО
| Приоритет";
Запрос. УстановитьПараметр( "МассивВидовРасчета" , МассивВидовРасчета) ; ВыборкаПриоритетов = Запрос. Выполнить( ) .
Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
РассчитатьНаборЗаписей( НаборЗаписей, ВыборкаПриоритетов. Приоритет, ТабличнаяЧасть) ;
КонецЦикла ;
КонецПроцедуры
После расчета записей каждого приоритета необходимо перезаписать весь набор в регистр для образования базы расчета для записей следующего приоритета. При этом параметр ТолькоЗапись метода Записать() должен быть установлен в значение Истина, так как пересчитывать фактический период действия уже не нужно, он был рассчитан при первоначальной записи.
ПРИМЕЧАНИЕ
После расчета записей последнего приоритета набор записей можно не перезаписывать, но только в том случае, если в документе после этого не будет производиться расчет записей другого регистра, который может использовать данные текущего регистра как базу. Например, если после расчета регистра основных начислений в модуле будет сразу производиться расчет дополнительных начислений, то записи регистра основных начислений после расчета последнего приоритета должны быть перезаписаны. Категория:
Регистры расчета Формирование набора записей по данным документа Для расчета записей необходимо сначала сформировать набор этих записей в регистре расчета. Это позволит использовать расчетные механизмы платформы. Формирование записей при расчете аналогично рассмотренному выше модулю формирования записей при проведении. Однако если при проведении в качестве набора записей выступали движения доку- мента по регистру (Движения.ОсновыеНачисленияРегл), то при расчете без проведения такой набор необходимо создать.
Ниже приведен модуль, позволяющий сформировать набор записей регистра расчета по данным документа. В тексте используется процедура
ДобавитьСтрокуОсновныхНачислений() , описанная выше. Этот модуль является начальным этапом процедуры
РассчитатьОсновныеНачисления() , которая вызывается при нажатии кнопки Рассчитать в форме документа.
Код 1C v 8.х Процедура РассчитатьОсновныеНачисления() Экспорт
НачатьТранзакцию( ) ;
НаборОсновныеНачисления = РегистрыРасчета. ОсновныеНачисленияРегл.
СоздатьНаборЗаписей( ) ; НаборОсновныеНачисления. Отбор. Регистратор. Значение = Ссылка; ВыборкаОсновныеНачисления = ОбщегоНазначения.
СформироватьЗапросПоТабличнойЧасти( ЭтотОбъект, "ОсновныеНачисления" ) . Выбрать( ) ;
Пока ВыборкаОсновныеНачисления. Следующий( ) Цикл
ДобавитьСтрокуОсновныхНачислений( ВыборкаОсновныеНачисления, НаборОсновныеНачисления) ;
КонецЦикла ;
ЗафиксироватьТранзакцию( ) ;
КонецПроцедуры
При формировании набора записей значения ресурсов не играют роли, так как они будут в дальнейшем изменены при расчете. В том числе эти значения могут быть пустыми.
Категория:
Регистры расчета Как сформировать сторно-запись регистра расчета, Метод «ПолучитьДополнение() Сторно-записи, «прикрывающие» фактический период действия вводимой записи с более поздним периодом регистрации, могут быть сформированы вручную стандартными методами формирования записей регистра расчета. В этом случае разработчик должен самостоятельно предусмотреть алгоритм, по которому будут сформированы сторно-записи, исходя из первоначального набора записей. Это достаточно сложный путь, предполагающий самостоятельный анализ взаимодействия периодов действия конкурирующих записей.
Вместо формирования собственных алгоритмов можно воспользоваться методом
ПолучитьДополнение() объекта
РегистрРасчетаНаборЗаписей . Суть его состоит в том, что система самостоятельно анализирует возможные конфликты формируемого набора записей с записями, имеющими более ранний период регистрации. Если обнаруживается пересечение периодов действия с конкурирующими записями, на каждое такое пересечение система предложит сформировать сторно-запись, которая позволит вводимому набору записей сохранить фактический период действия. При этом система укажет, по каким видам расчета необходимо ввести сторно-записи и какой период действия они должны иметь.
Метод
ПолучитьДополнение() применяется к набору записей регистра расчета, поддерживающего период действия, и не требует указания пара- метров. Данный метод возвращает значение типа ТаблицаЗначений, в котором содержатся все необходимые данные для формирования сторно-записей. Таблица включает значение всех полей записей, для которых должны быть введены сторно-записи (кроме полей Регистратор и НомерСтроки, которые не нужны для формирования сторно-записей), а также дополнительные поля – период регистрации сторно-записи и даты начала и окончания периода действия сторно-записи.
В приведенном примере для набора записей, состоящего из одной записи о больничном, метод
ПолучитьДополнение() вернет таблицу следующего вида:
Период регистрации Вид расчета Период действия … Период регистрации сторно Период действия начало сторно Период действия конец сторно
01.03.2010 Дежурство 01.03.2010 01.04.2010 15.03.2010 22.03.2010
Полученная таблица позволяет ввести необходимые сторно-записи без дополнительных вычислений. Ниже приведен текст модуля, в котором используется метод ПолучитьДополнение() и формируются сторно-записи в регистре расчета:
Код 1C v 8.х
НаборЗаписей = РегистрыРасчета. ОсновныеНачисленияРегл. СоздатьНаборЗаписей( ) ; НаборЗаписей. Отбор. Регистратор. Установить( Ссылка, Истина ) ; НаборЗаписей. Прочитать( ) ;
Для Каждого СтрокаСторно из ТаблицаСторно Цикл
Запись = Движения. ОсновныеНачисленияРегл. Добавить( ) ; Запись. ВидРасчета = СтрокаСторно. ВидРасчета; Запись. ПериодРегистрации = СтрокаСторно. ПериодРегистрацииСторно;
Запись. ПериодДействияНачало = СтрокаСторно. ПериодДействияНачалоСторно; Запись. ПериодДействияКонец = СтрокаСторно. ПериодДействияКонецСторно;
Запись. Сторно = Истина ; КонецЦикла
;
Таким образом, сторно-записи имеют те же значения полей, что и исходные записи, за исключением периода регистрации и периода действия. Сторно-записи отличаются от обычных записей значением Истина в предопределенном поле Сторно.
Категория:
Регистры расчета Поиск в базе битых ссылок - "объект не найден" В статье
Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID мы обсуждали как востановить битые ссылки!
А вот как найти в базе все битые ссылки, которые имеют вид типа "<Объект не найден> (137:8b270030482898d011daad3cc45fc830)"?
Для поиска этого была написана данная обработка:
Скачивать файлы может только зарегистрированный пользователь!
Для поиска: Выбираем объекты метаданных , которые хотим проверить, жмем кнопочку "Выполнить" и наблюдаем в таблице выходные данные. Откуда можем попасть в объекты-источники.
Для программиста:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ИспользоватьОграничение = ЗначениеЗаполнено( ОграничениеТипов) ;
РезультатПоиска. Очистить( ) ;
Для Каждого ОбъектыМетаданных Из КоллекцияОбъектов Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние( ОбъектМетаданных. ПолноеИмя( ) ) ;
ПроверитьОбъектНаБитыеСсылки( ОбъектМетаданных) ;
КонецЦикла ;
КонецЦикла ;
Для Каждого ОбъектыМетаданных Из КоллекцияРегистров Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние( ОбъектМетаданных. ПолноеИмя( ) ) ;
ПроверитьРегистрНаБитыеСсылки( ОбъектМетаданных) ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ВывестиДанные(ТекстЗапроса)
Запрос = Новый Запрос( ТекстЗапроса) ;
Попытка
РезультатЗапроса = Запрос. Выполнить( ) ;
Если Не РезультатЗапроса. Пустой( ) Тогда
ТЗ = РезультатЗапроса. Выгрузить( ) ;
Для Каждого Стр Из ТЗ Цикл
ОбработкаПрерыванияПользователя( ) ;
Строка = РезультатПоиска. Добавить( ) ;
ЗаполнитьЗначенияСвойств( Строка, Стр) ;
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( ИнформацияОбОшибке( ) . Описание + " " + ИнформацияОбОшибке( ) . Причина) ;
КонецПопытки ;
КонецПроцедуры
Процедура ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных. ПолноеИмя( ) ;
Если Метаданные. РегистрыСведений. Содержит( ОбъектМетаданных) Тогда
Если ОбъектМетаданных. РежимЗаписи = НезависимыйРежимЗаписи Тогда
Возврат ;
КонецЕсли ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
КонецЕсли ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Измерения, ИмяТаблицы) ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
АнализРегистратораРегистра( ОбъектМетаданных, ИмяТаблицы) ;
Если Метаданные. РегистрыБухгалтерии. Содержит( ОбъектМетаданных) Тогда
КонецЕсли ;
Если Метаданные. РегистрыРасчета. Содержит( ОбъектМетаданных) Тогда
КонецЕсли ;
КонецПроцедуры
Процедура ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных. ПолноеИмя( ) ;
АнализСвойствОбъекта( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
Для Каждого ТабЧасть Из ОбъектМетаданных. ТабличныеЧасти Цикл
Если ТабличныеЧастиИсключения. Найти( ТабЧасть. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
АнализСвойствОбъекта( ОбъектМетаданных, ТабЧасть. Реквизиты, ИмяТаблицы + "." + ТабЧасть. Имя)
КонецЦикла ;
Если Метаданные. Справочники. Содержит( ОбъектМетаданных) И ОбъектМетаданных. Владельцы. Количество( ) > 0 Тогда
МассивВладельцев = Новый Массив;
Для Каждого Элемент Из ОбъектМетаданных. Владельцы Цикл
МассивВладельцев. Добавить( Элемент) ;
КонецЦикла ;
КонецЕсли ;
ОбработкаПрерыванияПользователя( ) ;
КонецПроцедуры
Процедура АнализСвойствОбъекта(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения. Найти( Реквизит. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
Для Каждого моТип Из Реквизит. Тип. Типы( ) Цикл
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросОбъект( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит. Имя, моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура АнализСвойствРегистра(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения. Найти( Реквизит. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
Для Каждого моТип Из Реквизит. Тип. Типы( ) Цикл
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросРегистр( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит. Имя, моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы)
МассивРегистраторов = ПолучитьСписокРегистраторов( ОбъектМетаданных) ;
Для Каждого Регистратор Из МассивРегистраторов Цикл
Если РеквизитыИсключения. Найти( "Регистратор" ) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
моТип = Регистратор;
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросРегистр( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, "Регистратор" , моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Функция ПолучитьСписокРегистраторов(ОбъектМетаданных)
МассивРегистраторов = Новый Массив;
МенеджерОбъект = ПолучитьМенеджерОбъекта( ОбъектМетаданных) ;
Если МенеджерОбъект < > Неопределено Тогда
НаборЗаписей = МенеджерОбъект. СоздатьНаборЗаписей( ) ;
ЭлементОтбора = НаборЗаписей. Отбор. Регистратор;
МассивРегистраторов = ЭлементОтбора. ТипЗначения. Типы( ) ;
КонецЕсли ;
Возврат МассивРегистраторов;
КонецФункции
Функция ПолучитьМенеджерОбъекта(ОбъектМетаданных)
Перем МенеджерОбъекта;
Если Метаданные. РегистрыБухгалтерии. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыБухгалтерии[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыНакопления. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыНакопления[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыСведений. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыСведений[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыРасчета. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыРасчета[ОбъектМетаданных. Имя];
КонецЕсли ;
Возврат МенеджерОбъекта;
КонецФункции
Функция ПоискПоТипу(ИмяТипа)
Результат = Ложь ;
Если ИспользоватьОграничение Тогда
МассивСтрок = ОграничениеТипов. НайтиСтроки( Новый Структура( "ТипДанных" , ИмяТипа) ) ;
Если ЗначениеЗаполнено( МассивСтрок) Тогда
Результат = Истина ;
КонецЕсли ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Процедура ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| "" " + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Регистратор КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа( ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия( ИмяРеквизита, ТипРеквизита) ;
ТекстЗапроса = ТекстЗапроса + ? ( ПустаяСтрока( ТекстЗапроса) , "" , Символы. ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы. ПС) + Текст;
КонецПроцедуры
Процедура ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| "" " + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Ссылка КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа( ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия( ИмяРеквизита, ТипРеквизита) ;
ТекстЗапроса = ТекстЗапроса + ? ( ПустаяСтрока( ТекстЗапроса) , "" , Символы. ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы. ПС) + Текст;
КонецПроцедуры
Функция ДобавитьУсловия(ИмяРеквизита, ТипРеквизита)
мдОбъекта = Метаданные. НайтиПоТипу( ТипРеквизита) ;
ИмяТаблицы = мдОбъекта. ПолноеИмя( ) ;
ПроверкаНаПустыеЗначения = " Об." + ИмяРеквизита + " ССЫЛКА " + ИмяТаблицы;
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И ВЫРАЗИТЬ(Об." + ИмяРеквизита + " КАК " + ИмяТаблицы + ").Ссылка есть null" ;
Если Не Метаданные. Перечисления. Содержит( мдОбъекта) Тогда
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И Об." + ИмяРеквизита + " <> Значение(" + ИмяТаблицы + ".ПустаяСсылка)" ;
КонецЕсли ;
Возврат ПроверкаНаПустыеЗначения;
КонецФункции
Функция ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита)
ОбъектТипа = Метаданные. НайтиПоТипу( ТипРеквизита) ;
ИмяТаблицы = ОбъектТипа. ПолноеИмя( ) ;
ОписаниеТипа = """ " + ИмяТаблицы + """ КАК ТипДанных" ;
Возврат ОписаниеТипа;
КонецФункции
Процедура ОграничениеТиповТипДанныхНачалоВыбора(Элемент, СтандартнаяОбработка)
Перем ЭлементСписка;
СтандартнаяОбработка = Ложь ;
Строка = ЭлементыФормы. ОграничениеТипов. ТекущиеДанные;
Если Не ПустаяСтрока( Строка. ТипДанных) Тогда
ЭлементСписка = СписокТипов. НайтиПоЗначению( Строка. ТипДанных) ;
КонецЕсли ;
ВыбранныйЭлемент = СписокТипов. ВыбратьЭлемент( , ЭлементСписка) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Строка. ТипДанных = ВыбранныйЭлемент. Значение;
КонецЕсли ;
КонецПроцедуры
РеквизитыИсключения = Новый Массив;
ТабличныеЧастиИсключения = Новый Массив;
СписокТипов = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из Метаданные. Справочники Цикл
СписокТипов. Добавить( ОбъектМетаданных. ПолноеИмя( ) , ОбъектМетаданных. Имя, , БиблиотекаКартинок. СправочникОбъект) ;
КонецЦикла ;
Для Каждого ОбъектМетаданных Из Метаданные. Документы Цикл
СписокТипов. Добавить( ОбъектМетаданных. ПолноеИмя( ) , ОбъектМетаданных. Имя, , БиблиотекаКартинок. ДокументОбъект) ;
КонецЦикла ;
КоллекцияОбъектов = Новый Массив;
КоллекцияОбъектов. Добавить( Метаданные. ПланыОбмена) ;
КоллекцияОбъектов. Добавить( Метаданные. Справочники) ;
КоллекцияОбъектов. Добавить( Метаданные. Документы) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыВидовХарактеристик) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыСчетов) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыВидовРасчета) ;
КоллекцияОбъектов. Добавить( Метаданные. БизнесПроцессы) ;
КоллекцияОбъектов. Добавить( Метаданные. Задачи) ;
КоллекцияРегистров = Новый Массив;
КоллекцияРегистров. Добавить( Метаданные. РегистрыСведений) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыНакопления) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыБухгалтерии) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыРасчета) ;
Категория:
1С Общие вопросы - Обычные формы Как в запросе отобрать битые ссылки, поиск Битых Ссылок Когда объект был удален непосредственно, то все ссылки на него в справочниках, в документах, в регистрах стали битыми и отображаются следующим образом:
<Объект не найден> (16:bca8000c6efdd52111d8eaba7c9706eb)
Битая ссылка не является пустой. Т.е. метод Пустая() возвращает Ложь. Определить, что ссылка битая можно так:
Код 1C v 8.х Если Ссылка. ПолучитьОбъект( ) = Неопределено Тогда
КонецЕсли ;
Если Лев( СокрЛП( Ссылка) , 18 ) = "<Объект не найден>" Тогда
Код 1C v 8.х
Попытка
обьект= Ссылка. Ссылка;
Исключение
сообщить( "битая" ) ;
КонецПопытки ;
И последний вариант для проверки в запросах:
ГДЕ Объект.РеквизитОбъекта ЕСТЬ NULL И Не Объект=&ПустаяСсылкаОбъекта
Ниже дана программа для удаления записей регистров, у которых регистратор - битая ссылка, т.е. не существует в базе.
Код 1C v 8.х Процедура УдалениеБитыхСсылок(ИмяРегистра,ТипРегистра,ТипРегистраЗ)
МенеджерРегистра = ТипРегистра[ИмяРегистра];
Запрос = Новый Запрос( "
|ВЫБРАТЬ Регистратор
|ИЗ " + ТипРегистраЗ+ "." + ИмяРегистра+ "
|ГДЕ Регистратор.Ссылка ЕСТЬ NULL И НЕ Регистратор = &ПустаяСсылкаДокумента" ) ;
Запрос. УстановитьПараметр( "ПустаяСсылкаДокумента" , Неопределено ) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
Набор = ТипРегистра[ИмяРегистра]. СоздатьНаборЗаписей( ) ;
Набор. Отбор. Регистратор. Установить( Выборка. Регистратор) ;
Набор. Записать( ) ;
ОбработкаПрерыванияПользователя( ) ;
Состояние( "" + ТипРегистра+ " " + ИмяРегистра) ;
КонецЦикла ;
КонецПроцедуры
Процедура КнопкаВыполнитьНажатие(Кнопка)
Для Каждого пРегистр из Метаданные. РегистрыСведений Цикл
Подчинен = ( пРегистр. РежимЗаписи = Метаданные. СвойстваОбъектов. РежимЗаписиРегистра. ПодчинениеРегистратору) ;
Если Подчинен Тогда
УдалениеБитыхСсылок( пРегистр. Имя, РегистрыСведений, "РегистрСведений" )
КонецЕсли ;
КонецЦикла ;
Для Каждого пРегистр из Метаданные. РегистрыБухгалтерии Цикл
УдалениеБитыхСсылок( пРегистр. Имя, РегистрыБухгалтерии, "РегистрБухгалтерии" )
КонецЦикла ;
Для Каждого пРегистр из Метаданные. РегистрыРасчета Цикл
УдалениеБитыхСсылок( пРегистр. Имя, РегистрыРасчета, "РегистрРасчета" )
КонецЦикла ;
Для Каждого пРегистр из Метаданные. РегистрыНакопления Цикл
УдалениеБитыхСсылок( пРегистр. Имя, РегистрыНакопления, "РегистрНакопления" )
КонецЦикла ;
КонецПроцедуры
Категория:
Запросы Как очистить регистр расчета?! Код 1C v 8.х
Запрос= Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| УправленческиеНачисления.Регистратор
|ИЗ
| РегистрРасчета.УправленческиеНачисления КАК УправленческиеНачисления" ;
РезультатЗапроса = Запрос. Выполнить( ) ;
Выборка = РезультатЗапроса. Выбрать( ) ;
Кол= 0 ;
БылиОшибки= Ложь ;
Пока Выборка. Следующий( ) цикл
Набор = РегистрыРасчета. УправленческиеНачисления. СоздатьНаборЗаписей( ) ;
Набор. Отбор. Регистратор. Значение = Выборка. Регистратор;
Попытка
Набор. Записать( ) ;
Исключение
БылиОшибки= Истина ;
КонецПопытки ;
Кол= Кол+ 1 ;
ЕСЛИ Кол%100 = 0 Тогда
Сообщить( "Отработано " + Кол+ " документов из " + Выборка. Количество( ) ) ;
КонецЕсли ;
КонецЦикла ;
Если БылиОшибки Тогда
Предупреждение( "Обработка завершена. Регистр очищен не до конца!!!" ) ;
КонецЕсли ;
Категория:
Регистры расчета Выгрузка метаданных конфигурации в Microsoft Word и Excel Код 1C v 8.х
Перем ОбъектыКонфы;
Перем СтруктКонфы;
Процедура ВыгрузитьВWord()
Попытка
Word = Новый COMОбъект( "Word.Application" ) ;
Исключение
Сообщить( "Не удалось открыть Word" ) ;
Возврат ;
КонецПопытки ;
Word. Documents. Add( ) ;
Документ = Word. ActiveDocument( ) ;
Для Каждого ТипОбъекта Из ОбъектыКонфы Цикл
Состояние( ТипОбъекта. Значение) ;
Если Метаданные[ТипОбъекта. Ключ]. Количество( ) > 0 Тогда
Документ. Paragraphs. Add( ) ;
Номер = Документ. Paragraphs. Count( ) ;
Документ. Paragraphs( Номер- 1 ) . Range( ) . I_nsertAfter( ТипОбъекта. Значение) ;
Документ. Paragraphs( Номер) . Range( ) . Style= "Заголовок 1" ;
Для каждого Объект Из Метаданные[ТипОбъекта. Ключ] Цикл
Документ. Paragraphs. Add( ) ;
Номер = Документ. Paragraphs. Count( ) ;
Документ. Paragraphs( Номер- 1 ) . Range( ) . I_nsertAfter( Объект. Синоним) ;
Документ. Paragraphs( Номер) . Range( ) . Style= "Заголовок 2" ;
Для каждого Параметр Из СтруктКонфы Цикл
Попытка
Количество = Объект[Параметр. Ключ]. Количество( ) ;
Исключение
Продолжить;
КонецПопытки ;
Если Количество > 0 Тогда
Документ. Paragraphs. Add( ) ;
Номер = Документ. Paragraphs. Count( ) ;
Документ. Paragraphs( Номер- 1 ) . Range( ) . I_nsertAfter( Параметр. Значение + " (" + Количество + ")" ) ;
Документ. Paragraphs( Номер) . Range( ) . Style= "Заголовок 3" ;
Документ. Paragraphs. Add( ) ;
Номер= Документ. Paragraphs. Count( ) ;
Документ. Tables. Add( Документ. Paragraphs( Номер) . Range( ) , Количество+ 1 , 4 ) ;
Счетчик = 1 ;
Таблица = Документ. Tables( Документ. Tables. Count( ) ) ;
Таблица. Cell( Счетчик, 1 ) . Range( ) . I_nsertAfter( "Имя" ) ;
Таблица. Cell( Счетчик, 2 ) . Range( ) . I_nsertAfter( "Синоним" ) ;
Таблица. Cell( Счетчик, 3 ) . Range( ) . I_nsertAfter( "Тип" ) ;
Таблица. Cell( Счетчик, 4 ) . Range( ) . I_nsertAfter( "Комментарий" ) ;
Документ. Range( Таблица. Cell( Счетчик, 1 ) . Range. Start, Таблица. Cell( Счетчик, 4 ) . Range. End) . Font. Bold = Истина ;
Для каждого Значение Из Объект[Параметр. Ключ] Цикл
Счетчик = Счетчик + 1 ;
Попытка
Таблица. Cell( Счетчик, 1 ) . Range( ) . I_nsertAfter( Значение. Имя) ;
Исключение
КонецПопытки ;
Попытка
Таблица. Cell( Счетчик, 2 ) . Range( ) . I_nsertAfter( Значение. Синоним) ;
Исключение
КонецПопытки ;
Попытка
СтрокаТипов = "" ;
Для каждого Тип Из Значение. Тип. Типы( ) Цикл
СтрокаТипов = СтрокаТипов + " " + Строка( Тип) ;
КонецЦикла ;
Таблица. Cell( Счетчик, 3 ) . Range( ) . I_nsertAfter( СтрокаТипов) ;
Исключение
КонецПопытки ;
Попытка
Таблица. Cell( Счетчик, 4 ) . Range( ) . I_nsertAfter( Значение. Комментарий) ;
Исключение
КонецПопытки ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Word. Visible = Истина ;
Word. Activate( ) ;
Word = Неопределено ;
КонецПроцедуры
Процедура ВыгрузитьВExcel()
Попытка
Excel = Новый COMОбъект( "Excel.Application" ) ;
Исключение
Сообщить( "Не удалось открыть Excel" ) ;
Возврат ;
КонецПопытки ;
Excel. Application. Workbooks. Add( 1 ) ;
Лист = Excel. ActiveSheet;
Лист. Name = "Данные" ;
НомерСтроки = 0 ;
Для Каждого ТипОбъекта Из ОбъектыКонфы Цикл
Состояние( ТипОбъекта. Значение) ;
Если Метаданные[ТипОбъекта. Ключ]. Количество( ) > 0 Тогда
НомерСтроки = НомерСтроки + 1 ;
Лист. Cells( НомерСтроки, 1 ) . Value = ТипОбъекта. Значение;
Лист. Cells( НомерСтроки, 1 ) . Font. Size = 16 ;
Лист. Cells( НомерСтроки, 1 ) . Font. ColorIndex = 3 ;
Для каждого Объект Из Метаданные[ТипОбъекта. Ключ] Цикл
НомерСтроки = НомерСтроки + 1 ;
Лист. Cells( НомерСтроки, 1 ) . Value = Объект. Синоним;
Лист. Cells( НомерСтроки, 1 ) . I_nsertIndent( 2 ) ;
Лист. Cells( НомерСтроки, 1 ) . Font. Size = 12 ;
Лист. Cells( НомерСтроки, 1 ) . Font. ColorIndex = 5 ;
Для каждого Параметр Из СтруктКонфы Цикл
Попытка
Количество = Объект[Параметр. Ключ]. Количество( ) ;
Исключение
Продолжить;
КонецПопытки ;
Если Количество > 0 Тогда
НомерСтроки = НомерСтроки + 1 ;
Лист. Cells( НомерСтроки, 1 ) . Value = Параметр. Значение + " (" + Количество + ")" ;
Лист. Cells( НомерСтроки, 1 ) . I_nsertIndent( 4 ) ;
Лист. Cells( НомерСтроки, 1 ) . Font. Bold = Истина ;
Лист. Cells( НомерСтроки, 1 ) . Font. ColorIndex = 16 ;
НомерСтроки = НомерСтроки + 1 ;
Лист. Cells( НомерСтроки, 1 ) . Value = "Имя" ;
Лист. Cells( НомерСтроки, 2 ) . Value = "Синоним" ;
Лист. Cells( НомерСтроки, 3 ) . Value = "Тип" ;
Лист. Cells( НомерСтроки, 4 ) . Value = "Комментарий" ;
Для Ном = 1 По 4 Цикл
Лист. Cells( НомерСтроки, Ном) . ColumnWidth = 20 ;
Лист. Cells( НомерСтроки, Ном) . Font. Bold = Истина ;
Лист. Cells( НомерСтроки, Ном) . Borders( 5 ) . LineStyle = - 4142 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 7 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 8 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 9 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 10 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Interior. ColorIndex = 34 ;
КонецЦикла ;
Для каждого Значение Из Объект[Параметр. Ключ] Цикл
НомерСтроки = НомерСтроки + 1 ;
Попытка
Лист. Cells( НомерСтроки, 1 ) . Value = Значение. Имя;
Исключение
КонецПопытки ;
Попытка
Лист. Cells( НомерСтроки, 2 ) . Value = Значение. Синоним;
Исключение
КонецПопытки ;
Попытка
СтрокаТипов = "" ;
Для каждого Тип Из Значение. Тип. Типы( ) Цикл
СтрокаТипов = СтрокаТипов + " " + Строка( Тип) ;
КонецЦикла ;
Лист. Cells( НомерСтроки, 3 ) . Value = СтрокаТипов;
Исключение
КонецПопытки ;
Попытка
Лист. Cells( НомерСтроки, 4 ) . Value = Значение. Комментарий;
Исключение
КонецПопытки ;
Для Ном = 1 По 4 Цикл
Лист. Cells( НомерСтроки, Ном) . Borders( 5 ) . LineStyle = - 4142 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 7 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 8 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 9 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . Borders( 10 ) . LineStyle = 1 ;
Лист. Cells( НомерСтроки, Ном) . VerticalAlignment = - 4160 ;
Лист. Cells( НомерСтроки, Ном) . WrapText = Истина ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Excel. Visible = Истина ;
Excel = Неопределено ;
КонецПроцедуры
Процедура Сформировать()
ОбъектыКонфы = Новый Структура( ) ;
ОбъектыКонфы. Вставить( "ОбщиеМодули" , "Общие модули" ) ;
ОбъектыКонфы. Вставить( "ОбщиеФормы" , "Общие формы" ) ;
ОбъектыКонфы. Вставить( "ОбщиеМакеты" , "Общие макеты" ) ;
ОбъектыКонфы. Вставить( "ОбщиеКартинки" , "Общие картинки" ) ;
ОбъектыКонфы. Вставить( "Роли" , "Роли" ) ;
ОбъектыКонфы. Вставить( "Интерфейсы" , "Интерфейсы" ) ;
ОбъектыКонфы. Вставить( "Стили" , "Стили" ) ;
ОбъектыКонфы. Вставить( "Языки" , "Языки" ) ;
ОбъектыКонфы. Вставить( "ПланыОбмена" , "Планы обмена" ) ;
ОбъектыКонфы. Вставить( "Константы" , "Константы" ) ;
ОбъектыКонфы. Вставить( "КритерииОтбора" , "Критерии отбора" ) ;
ОбъектыКонфы. Вставить( "Справочники" , "Справочники" ) ;
ОбъектыКонфы. Вставить( "Документы" , "Документы" ) ;
ОбъектыКонфы. Вставить( "ЖурналыДокументов" , "Журналы документов" ) ;
ОбъектыКонфы. Вставить( "Перечисления" , "Перечисления" ) ;
ОбъектыКонфы. Вставить( "Отчеты" , "Отчеты" ) ;
ОбъектыКонфы. Вставить( "Обработки" , "Обработки" ) ;
ОбъектыКонфы. Вставить( "ПланыВидовХарактеристик" , "Планы видов характеристик" ) ;
ОбъектыКонфы. Вставить( "ПланыСчетов" , "Планы счетов" ) ;
ОбъектыКонфы. Вставить( "ПланыВидовРасчета" , "Планы видов расчета" ) ;
ОбъектыКонфы. Вставить( "РегистрыСведений" , "Регистры сведений" ) ;
ОбъектыКонфы. Вставить( "РегистрыБухгалтерии" , "Регистры бухгалтерии" ) ;
ОбъектыКонфы. Вставить( "РегистрыРасчета" , "Регистры расчета" ) ;
СтруктКонфы = Новый Структура( ) ;
СтруктКонфы. Вставить( "Измерения" , "Измерения" ) ;
СтруктКонфы. Вставить( "Ресурсы" , "Ресурсы" ) ;
СтруктКонфы. Вставить( "Реквизиты" , "Реквизиты" ) ;
СтруктКонфы. Вставить( "Формы" , "Формы" ) ;
СтруктКонфы. Вставить( "Макеты" , "Макеты" ) ;
СтруктКонфы. Вставить( "Графы" , "Графы" ) ;
СтруктКонфы. Вставить( "ТабличныеЧасти" , "Табличные части" ) ;
СтруктКонфы. Вставить( "Значения" , "Значения" ) ;
ВыгрузитьВWord( ) ;
ВыгрузитьВExcel( ) ;
КонецПроцедуры
Код 1C v 7.x
Процедура Справочник()
Ворд= СоздатьОбъект( "Word.Application" ) ;
Ворд. DisplayAlerts= 0 ;
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Код" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= ? ( Метаданные. Справочник( СокрЛП( Имя) ) . ТипКода= "Текстовый" , "Строка" , "Число" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип+ " (" + СокрЛП( Метаданные. Справочник( СокрЛП( Имя) ) . ДлинаКода) + ")" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Наименование" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Строка (" + СокрЛП( Метаданные. Справочник( СокрЛП( Имя) ) . ДлинаНаименования) + ")" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "" ) ;
Для Сч= 1 По Метаданные. Справочник( СокрЛП( Имя) ) . Реквизит( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Реквизит= Метаданные. Справочник( СокрЛП( Имя) ) . Реквизит( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Предупреждение( "Готово" , 5 ) ;
КонецПроцедуры
Процедура Документ()
Ворд= СоздатьОбъект( "Word.Application" ) ;
Ворд. DisplayAlerts= 0 ;
Для Сч= 1 По Метаданные. Документ( СокрЛП( Имя) ) . РеквизитШапки( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Шапка" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Документ( СокрЛП( Имя) ) . РеквизитШапки( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Для Сч= 1 По Метаданные. Документ( СокрЛП( Имя) ) . РеквизитТабличнойЧасти( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Таб. часть" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Документ( СокрЛП( Имя) ) . РеквизитТабличнойЧасти( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Предупреждение( "Готово" , 5 ) ;
КонецПроцедуры
Процедура Общие()
Ворд= СоздатьОбъект( "Word.Application" ) ;
Ворд. DisplayAlerts= 0 ;
Для Сч= 1 По Метаданные. ОбщийРеквизитДокумента( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Шапка" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. ОбщийРеквизитДокумента( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Предупреждение( "Готово" , 5 ) ;
КонецПроцедуры
Процедура СтруктураРегистра()
Ворд= СоздатьОбъект( "Word.Application" ) ;
Ворд. DisplayAlerts= 0 ;
Для Сч= 1 По Метаданные. Регистр( СокрЛП( Имя) ) . Измерение( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Измерение" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Регистр( СокрЛП( Имя) ) . Измерение( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Для Сч= 1 По Метаданные. Регистр( СокрЛП( Имя) ) . Ресурс( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Ресурс" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Регистр( СокрЛП( Имя) ) . Ресурс( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Для Сч= 1 По Метаданные. Регистр( СокрЛП( Имя) ) . Реквизит( ) Цикл
Ворд. ActiveDocument. ActiveWindow. S_election. I_nsertRowsBelow( 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveLeft( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( "Реквизит" ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Реквизит= Метаданные. Регистр( СокрЛП( Имя) ) . Реквизит( Сч) ;
Синоним= Реквизит. Синоним;
Если ПустоеЗначение( Синоним) = 0 Тогда
Если нрег( СтрЗаменить( Синоним, " " , "" ) ) < > нрег( Реквизит. Идентификатор) Тогда
Синоним= " (" + Синоним+ ")" ;
Иначе
Синоним= "" ;
КонецЕсли ;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( СокрЛП( Реквизит. Идентификатор) + Синоним) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Тип= Реквизит. Тип;
Если Тип= "Строка" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) + ")" ;
ИначеЕсли Тип= "Число" Тогда
Тип= Тип+ " (" + СокрЛП( Реквизит. Длина) ;
Если ПустоеЗначение( Реквизит. Точность) = 0 Тогда
Тип= Тип+ "." + СокрЛП( Реквизит. Точность) ;
КонецЕсли ;
Тип= Тип+ ")" ;
Иначе
Тип= Тип+ "." + Реквизит. Вид;
КонецЕсли ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Тип) ;
Ворд. ActiveDocument. ActiveWindow. S_election. MoveRight( 1 , 1 ) ;
Ворд. ActiveDocument. ActiveWindow. S_election. TypeText( Реквизит. Комментарий) ;
КонецЦикла ;
Предупреждение( "Готово" , 5 ) ;
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Прочитать, просмотреть, выбрать записи регистра расчета Код 1C v 8.х
НаборЗаписей = РегистрыРасчета. УдержанияРаботниковОрганизаций. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Отбор. Регистратор. Значение = ВыбДокНачисл;
НаборЗаписей. Отбор. физлицо. Установить( Физлицо) ;
НаборЗаписей. Прочитать( ) ;
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись. ВидРасчета= ПланыВидовРасчета. УдержанияОрганизаций. Неявка тогда
СумУдерж= СумУдерж+ Запись. Результат;
КонецЕсли ;
КонецЦикла ;
Категория:
Регистры расчета