Как установить цену из РегистраСведений на дату создания документа Код 1C v 8.3
&НаКлиенте
Процедура ТоварНоменклатураПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭтаФорма. ТекущийЭлемент. ТекущиеДанные;
Номенклатура = СтрокаТабличнойЧасти. Номенклатура;
ТипЦен = ЭтаФорма. ТипЦен;
ТекДата = Объект. Дата;
СтрокаТабличнойЧасти. Цена = ПолучитьЦену( Номенклатура, ТипЦен, ТекДата) ;
КонецПроцедуры
&НаСервере
Функция ПолучитьЦену(Номенклатура, ТипЦен, ТекДата) Экспорт
Отбор = Новый Структура;
Отбор. Вставить( "Номенклатура" , Номенклатура) ;
Отбор. Вставить( "ТипЦены" , ТипЦен) ;
ЦенаТовара = РегистрыСведений. ЦеныНоменклатуры. ПолучитьПоследнее( ТекДата, Отбор) ;
Возврат ЦенаТовара. Цена;
КонецФункции
Категория:
Регистры сведений Загрузка данных в 1С из PDF В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert.
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = "," ) Экспорт
МассивСтрок = Новый Массив( ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
ТекЗнч = СокрЛП( Лев( Стр, Поз- 1 ) ) ;
Если ЗначениеЗаполнено( ТекЗнч) Тогда
МассивСтрок. Добавить( ТекЗнч) ;
КонецЕсли ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
тч. Очистить( ) ;
НайденныеФайлы = НайтиФайлы( ПутьКPDF, "*.pdf" , ложь ) ;
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ. Добавить( ) ;
Нстр. ФайлPDF = стр. Имя;
КонецЦикла ;
ЭтаФорма. Обновить( ) ;
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП( ПутьКPDF+ "\" + стр. ФайлPDF) ;
txt = СтрЗаменить( pdf, "pdf" , "txt" ) ;
Команд = ПутьКPDF2TXT+ "\pdf2txt.exe " + pdf+ " " + txt;
ЗапуститьПриложение( Команд, ПутьКPDF, Истина ) ;
стр. ФайлTXT = txt;
Исключение
стр. ФайлTXT = "!!!_ОШИБКА" ;
КонецПопытки ;
ЭлементыФормы. ТЧ. ТекущаяСтрока = стр;
ЭлементыФормы. ТЧ. ОбновитьСтроки( стр) ;
КонецЦикла ;
мТекущийПользователь = глЗначениеПеременной( "глТекущийПользователь" ) ;
мСкладПоУмолчанию = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнойСклад" ) ;
мОсновноеПодразделение = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновноеПодразделение" ) ;
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов" ) ;
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам" ) ;
мВидНоменклатурыПоУмолчанию = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнойВидНоменклатуры" ) ;
мОтражатьВРеглУчете = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете" ) ;
мОтражатьВБухУчета = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете" ) ;
мОтражатьВНалУчете = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете" ) ;
Для каждого стр Из ТЧ Цикл
Состояние( "Загружаю: " + стр. ФайлTXT) ;
текдок= Новый ТекстовыйДокумент;
текдок. Прочитать( стр. ФайлTXT, "UTF-8" ) ;
ЗагрузкаТЧ= Ложь ;
ДокВозвратТоваровОтПокупателя = Документы. ВозвратТоваровОтПокупателя. СоздатьДокумент( ) ;
ДокВозвратТоваровОтПокупателя. Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя. Дата = ОбщегоНазначения. ПолучитьРабочуюДату( ) ;
ДокВозвратТоваровОтПокупателя. УстановитьНовыйНомер( ) ;
ДокВозвратТоваровОтПокупателя. ВидПоступления = Перечисления. ВидыПоступленияТоваров. НаСклад;
ДокВозвратТоваровОтПокупателя. СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя. Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя. ВалютаДокумента = Справочники. Валюты. НайтиПоКоду( "643" ) ;
ДокВозвратТоваровОтПокупателя. УчитыватьНДС = ИСТИНА ;
ДокВозвратТоваровОтПокупателя. СуммаВключаетНДС = ИСТИНА ;
Для Ном= 1 по текдок. КоличествоСтрок( ) цикл
ТСтр = текдок. ПолучитьСтроку( Ном) ;
ТекСтр = СокрЛП( ТСтр) ;
Если Найти( ТекСтр, "Всего по накладной" ) > 0 Тогда
ЗагрузкаТЧ= Ложь ;
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя. Товары Цикл
ОбработкаТабличныхЧастей. РассчитатьКоличествоМестТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
ОбработкаТабличныхЧастей. РассчитатьСуммуТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
ОбработкаТабличныхЧастей. РассчитатьСуммуНДСТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
КонецЦикла ;
Попытка
ДокВозвратТоваровОтПокупателя. Записать( РежимЗаписиДокумента. Проведение) ;
Исключение
ДокВозвратТоваровОтПокупателя. Записать( РежимЗаписиДокумента. Запись) ;
КонецПопытки ;
стр. Документ = ДокВозвратТоваровОтПокупателя. Ссылка;
стр. Инфо = "Все ОК" ;
ЭлементыФормы. ТЧ. ТекущаяСтрока = стр;
ЭлементыФормы. ТЧ. ОбновитьСтроки( стр) ;
Прервать ;
КонецЕсли ;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить( ТекСтр, "подложке " , "подложке" ) ;
ТекСтр = СтрЗаменить( ТекСтр, " " , "|" ) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( ТекСтр, "|" ) ;
Если СтрМ. Количество( ) > 2 Тогда
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя. Товары. Добавить( ) ;
НоваяСтрока. Номенклатура = Справочники. Номенклатура. НайтиПоКоду( СтрМ[2 ]) ;
НоваяСтрока. ЕдиницаИзмерения = НоваяСтрока. Номенклатура. БазоваяЕдиницаИзмерения;
НоваяСтрока. Коэффициент = 1 ;
НоваяСтрока. Количество = Число( СтрМ[6 ]) ;
НоваяСтрока. Цена = Число( СтрМ[7 ]) ;
НоваяСтрока. Сумма = Число( СтрМ[8 ]) ;
НоваяСтрока. СуммаНДС = Число( СтрМ[11 ]) ;
НоваяСтрока. Качество = Справочники. Качество. Новый ;
Попытка
НоваяСтрока. СтавкаНДС = Перечисления. СтавкиНДС["НДС" + Лев( СокрЛП( СтрМ[9 ]) , 2 ) ];
Исключение
НоваяСтрока. СтавкаНДС = НоваяСтрока. Номенклатура. СтавкаНДС;
КонецПопытки ;
Исключение
Сообщить( "Не загружено: " + ТекСтр) ;
КонецПопытки ;
Иначе
Продолжить;
КонецЕсли ;
Иначе
КонецЕсли ;
Если Найти( ТекСтр, "Товарная накладная" ) > 0 Тогда
ТекСтр = СтрЗаменить( ТекСтр, " " , "|" ) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( ТекСтр, "|" ) ;
Если СтрМ. Количество( ) > 1 Тогда
ДокВозвратТоваровОтПокупателя. НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1 ];
ТекДата = СтрМ[2 ];
ДокВозвратТоваровОтПокупателя. ДатаВходящегоДокументаЭлектронногоОбмена = Дата( Прав( ТекДата, 4 ) + Сред( ТекДата, 4 , 2 ) + Лев( ТекДата, 2 ) ) ;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Грузополучатель:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекОрганизация = Справочники. Организации. НайтиПоРеквизиту( "ИНН" , текИНН) ;
Если ТекОрганизация= Справочники. Организации. ПустаяСсылка( ) Тогда
ДокВозвратТоваровОтПокупателя. Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя. Организация = ТекОрганизация;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Поставщик:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекПоставщик = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , текИНН) ;
ДокВозвратТоваровОтПокупателя. Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя. ДоговорКонтрагента = ТекПоставщик. ОсновнойДоговорКонтрагента;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Плательщик:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекПлательщик = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , текИНН) ;
КонецЕсли ;
КонецЕсли ;
Если текстр= "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ= Истина ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытия. Каталог = "" ;
ДиалогОткрытия. МножественныйВыбор = Ложь ;
ДиалогОткрытия. Заголовок = "Выберите каталог с PDF2TXT" ;
Если ДиалогОткрытия. Выбрать( ) Тогда
ПутьКPDF2TXT = ДиалогОткрытия. Каталог;
ПутьКPDF = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытия. Каталог = "" ;
ДиалогОткрытия. МножественныйВыбор = Ложь ;
ДиалогОткрытия. Заголовок = "Выберите каталог с PDF2TXT" ;
Если ДиалогОткрытия. Выбрать( ) Тогда
ПутьКPDF = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры
Категория:
Загрузка данных в 1С Функция проверки необходимости перерасчета и Перерасчет записей Код 1C v 8.х
Функция НеобходимостьПерерасчета(Регистратор) Экспорт
Запрос = Новый Запрос( "ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
|ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо КАК ФизЛицо
| ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
| ИЗ
|РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор) КАК Перерасчет" ) ;
Запрос. УстановитьПараметр( "Регистратор" , Регистратор) ; Если Запрос. Выполнить( ) . Пустой( ) Тогда
Возврат Ложь ;
Иначе
Возврат Истина ;
КонецЕсли ;
КонецФункции
Данная функция возвращает значение Истина, если хотя бы в одной из таблиц перерасчета есть хотя бы одна запись по данному документу. Если таких записей нет, то функция вернет значение Ложь, и перерассчитывать записи этого документа не нужно.
Собственно перерасчет записей, как и их расчет, рекомендуется выполнять в процедуре общего модуля по тем же причинам, что и расчет. Процедура перерасчета отличается от процедуры расчета только тем, что в расчете участвуют не все записи документа, а только удовлетворяющие усло- виям проводимого перерасчета. Например, только записи по конкретным сотрудникам и конкретным видам расчета.
Наконец, после того как нужные записи перерассчитаны, необхо- димо средствами встроенного языка удалить соответствующие записи из таблицы перерасчета, так как перерасчет больше не требуется.
Процедуру перерасчета записей документа рекомендуется помещать в модуле этого документа как экспортную процедуру. В этом случае она может быть вызвана из других модулей, в том числе из обработки перерасчета, описанной в предыдущем разделе. В качестве параметров в процедуру должна передаваться информация о том, какие именно записи документа необходимо перерассчитать. Ниже приведен пример такой процедуры, где в качестве параметра используется список сотрудников, по которым необходимо выполнить перерасчет.
Процедура перерасчета записей документа
Код 1C v 8.х Процедура Перерассчитать(Физлица = Неопределено) Экспорт
Если Не Расчеты. НеобходимостьПерерасчета( Ссылка) Тогда
Возврат ; КонецЕсли ;
Расчеты. ПерерассчитатьЗаписиРегистраРасчета( "ОсновныеНачисленияРегл" , Движения. ОсновныеНачисленияРегл, ОсновныеНачисления, Физлица) ;
Движения. ОсновныеНачисленияРегл. Записать( Истина , Истина ) ;
Расчеты. ПерерассчитатьЗаписиРегистраРасчета( "ДополнительныеНачисленияРегл" , Движения. ДополнительныеНачисленияРегл, ДополнительныеНачисления, Физлица) ;
Движения. ДополнительныеНачисленияРегл. Записать( Истина , Истина ) ;
Если Н = 1 Тогда
НаборЗаписей = РегистрыРасчета. ОсновныеНачисленияРегл.
Перерасчеты. ПерерасчетОсновныхНачислений. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Записать( ) ; КонецЦикла ;
КонецПроцедуры
Процедуры общего модуля, выполняющие непосредственный перерасчет записей, по алгоритму схожи с процедурами расчета. Основное отличие состоит в том, что в процедурах перерасчета происходит расчет только тех записей, которые удовлетворяют заданным условиям. В данном случае это записи по заданному списку сотрудников. Также при перерасчете не нужно производить предварительную запись набора с формированием фактического периода действия, так как набор уже записан в регистр (перерассчитываемый документ всегда проведен). Ниже приведен пример процедур
ПерерассчитатьЗаписиРегистраРасчета() и ПерерассчитатьНаборЗаписей() . Эти процедуры используют вызов тех же самых процедур и функций, которые используются при расчете.
Процедуры перерасчета записей
Код 1C v 8.х Процедура ПерерассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабличнаяЧасть = Неопределено, ФизЛица = Неопределено)
Для каждого Запись из НаборЗаписей Цикл
Если Запись. ВидРасчета. Приоритет = Приоритет Тогда
Если НЕ ФизЛица. НайтиПоЗначению( Запись. Физлицо) = Неопределено Тогда
ДанныеДляРасчета = ПолучитьДанныеДляРасчета( Запись) ;
Иначе
НаборЗаписей = РегистрыРасчета. ДополнительныеНачисленияРегл.
Перерасчеты. ПерерасчетДополнительныхНачислений. СоздатьНаборЗаписей( ) ;
КонецЕсли ;
НаборЗаписей. Отбор. ОбъектПерерасчета. Значение = Ссылка; Если Физлица < > НеОпределено Тогда
НаборЗаписей. Прочитать( ) ; СтрокиКУдалению = Новый Массив;
Для Каждого СтрокаПерерасчета из НаборЗаписей Цикл
Если Физлица. НайтиПоЗначению( СтрокаПерерасчета. Физлицо) < > НеОпределено Тогда СтрокиКУдалению. Добавить( СтрокаПерерасчета) ;
КонецЕсли ; КонецЦикла ;
Для Каждого Строка Из СтрокиКУдалению Цикл
НаборЗаписей. Удалить( Строка) ; КонецЦикла ;
КонецЕсли ;
СтрокаТабличнойЧасти = ТабличнаяЧасть. Получить( Запись. НомерСтроки- 1 ) ;
СтрокаТабличнойЧасти. Результат = Запись. Результат; КонецЕсли ;
КонецЕсли ; КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Процедура ПерерассчитатьЗаписиРегистраРасчета(ИмяРегистра,
НаборЗаписей, ТабличнаяЧасть = Неопределено, Физлица = Неопределено) Экспорт
Регистратор = НаборЗаписей. Отбор. Регистратор. Значение;
Запрос = Новый Запрос; Запрос. Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + ИмяРегистра + ".ВидРасчета.Приоритет КАК Приоритет
|ИЗ
| РегистрРасчета." + ИмяРегистра + " КАК " + ИмяРегистра + "
|ГДЕ
| ФизЛицо В (&СписокФизлиц) И Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| Приоритет
|ИТОГИ ПО
| " + ИмяРегистра + ".ВидРасчета.Приоритет" ;
Запрос. УстановитьПараметр( "СписокФизлиц" , Физлица) ; Запрос. УстановитьПараметр( "Регистратор" , Регистратор) ;
ВыборкаПриоритетов = Запрос. Выполнить( ) .
Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
ПерерассчитатьНаборЗаписей( НаборЗаписей, ВыборкаПриоритетов. Приоритет, ТабличнаяЧасть, Физлица) ;
КонецЦикла ;
КонецПроцедуры
Категория:
Регистры расчета Получение данных для расчета и Расчет Собственно процесс расчета записей каждого поднабора состоит в получении всех необходимых данных для расчета каждой записи и вычислении значений ресурсов этой записи по формуле, определяемой способом расчета данной записи. Например, для расчета записи об окладе нужно будет получить данные графика этой записи, для расчета премии необходимо будет рассчитать базу и так далее.
Ниже приведен пример процедуры, осуществляющей расчет набора записей одного приоритета. Для каждой записи при помощи функции
ПолучитьДанныеДляРасчета() возвращается структура данных, которая передается в процедуру РассчитатьЗапись().
Расчет набора записей одного приоритета
Код 1C v 8.х Процедура РассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабличнаяЧасть = Неопределено)
Иначе
СтруктураДанных. Вставить( "ОтработаноВремени" , 0 ) ; СтруктураДанных. Вставить( "НормаВремени" , 0 ) ;
Для каждого Запись из НаборЗаписей Цикл
Если Запись. ВидРасчета. Приоритет = Приоритет Тогда
ДанныеДляРасчета = ПолучитьДанныеДляРасчета( Запись) ;
СтрокаТабличнойЧасти = ТабличнаяЧасть. Получить( Запись. НомерСтроки- 1 ) ; СтрокаТабличнойЧасти. Результат = Запись. Результат;
КонецЕсли ; КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
В функции ПолучитьДанныеДляРасчета() должны быть прописаны алгоритмы, при помощи которых можно получить данные для расчета записи с любым способом расчета, существующим в конфигурации. Ниже приведен пример функции, которая получает данные для трех способов расчета:
Получение данных для трех видов расчета
Код 1C v 8.х Функция ПолучитьДанныеДляРасчета(Запись)
СпособРасчета = Запись. ВидРасчета. СпособРасчета; СтруктураДанных = Новый Структура;
Если СпособРасчета = Перечисления. СпособыРасчета. ПоМесячнойСтавке Тогда
Запрос = Новый Запрос( "
|ВЫБРАТЬ
| ДанныеГрафика.ЗначениеФактическийПериодДействия КАК ГрафикФакт,
| ДанныеГрафика.ЗначениеПериодДействия КАК ГрафикНорма
|ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ДанныеГрафика(
| Регистратор = &Регистратор
| И НомерСтроки = &НомерСтроки)
КАК ДанныеГрафика" ) ;
Запрос. УстановитьПараметр( "Регистратор" , Запись. Регистратор) ; Запрос. УстановитьПараметр( "НомерСтроки" , Запись. НомерСтроки) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
СтруктураДанных. Вставить( "ОтработаноВремени" , Выборка. ГрафикФакт) ;
СтруктураДанных. Вставить( "НормаВремени" , Выборка. ГрафикНорма) ;
КонецЕсли ;
ИначеЕсли
СпособРасчета = Перечисления. СпособыРасчета. ПроцентомОтБазы Тогда
Запрос = Новый Запрос( "
|ВЫБРАТЬ
| База.РезультатБаза
|ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.БазаОсновныеНачисленияРегл(
| &Измерения, &Измерения, ,
| Регистратор = &Регистратор
| И НомерСтроки = &НомерСтроки) КАК База" ) ;
Измерения = Новый Массив( 2 ) ; Измерения[0 ] = "ФизЛицо" ; Измерения[1 ] = "Организация" ;
Запрос. УстановитьПараметр( "Регистратор" , Запись. Регистратор) ;
Запрос. УстановитьПараметр( "НомерСтроки" , Запись. НомерСтроки) ;
Запрос. УстановитьПараметр( "Измерения" , Измерения) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
СтруктураДанных. Вставить( "База" , Выборка. РезультатБаза) ;
Иначе
СтруктураДанных. Вставить( "База" , 0 ) ;
КонецЕсли ;
ИначеЕсли СпособРасчета = Перечисления. СпособыРасчета. ПоСдельнойВыработке Тогда
Запрос = Новый Запрос( "
|ВЫБРАТЬ
| СУММА(СдельнаяВыработкаОбороты.ВыработкаОборот) КАК ВыработкаОборот
|ИЗ
| РегистрНакопления.СдельнаяВыработка.Обороты(
| &ДатаНачало, &ДатаКонец, ,
| Организация = &Организация И ФизЛицо = &ФизЛицо)
| КАК СдельнаяВыработкаОбороты" ) ;
Запрос. УстановитьПараметр( "ДатаНачало" , НачалоДня( Запись. ПериодДействияНачало) ) ;
Запрос. УстановитьПараметр( "ДатаКонец" , КонецДня( Запись. ПериодДействияКонец) ) ;
Запрос. УстановитьПараметр( "ФизЛицо" , Запись. ФизЛицо) ; Запрос. УстановитьПараметр( "Организация" , Запись. Организация) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ; Если Выборка. Следующий( ) Тогда
СтруктураДанных. Вставить( "Выработка" , Выборка. ВыработкаОборот) ;
Иначе
СтруктураДанных. Вставить( "Выработка" , 0 ) ; КонецЕсли ;
КонецЕсли ;
Возврат СтруктураДанных;
КонецФункции
В данном случае для расчета записей со способом ПоМесячнойСтавке система получит данные графика за период действия и фактический период действия, для способа ПроцентомОтБазы будет получена расчетная база записи, а для способа ПоСдельнойВыработке будут рассчитаны обороты по соответствующему регистру накопления за интервал периода действия записи. Способ расчета ФиксированнойСуммой не требует получения данных.
Функция ПолучитьДанныеДляРасчета() возвращает структуру, содер- жащую различные поля в зависимости от способа расчета, применяемого в данной записи
Расчет значений ресурсов записи
После того как данные для расчета получены, необходимо прописать в модуле формулу для заполнения реквизитов каждой записи в соответствии со способом расчета. В данном случае эту функцию выполняет процедура РассчитатьЗапись(). В процедуре РассчитатьЗапись() для каждого возмож- ного способа расчета описывается формула, позволяющая из реквизитов записи и полученных данных рассчитать значения ресурсов этой записи.
Процедура расчета записей
Код 1C v 8.х Процедура РассчитатьЗапись(Запись, ДанныеДляРасчета) СпособРасчета = Запись.ВидРасчета.СпособРасчета;
Если СпособРасчета = Перечисления. СпособыРасчета. ПоМесячнойСтавке Тогда
Если Не ДанныеДляРасчета. НормаВремени = 0 Тогда
Результат = Запись. Размер * ДанныеДляРасчета. ОтработаноВремени / ДанныеДляРасчета. НормаВремени;
Иначе
Результат = 0 ; КонецЕсли ;
ИначеЕсли
СпособРасчета = Перечисления. СпособыРасчета. ПроцентомОтБазы Тогда
Результат = Запись. Размер * ДанныеДляРасчета. База / 100 ;
ИначеЕсли
СпособРасчета = Перечисления. СпособыРасчета. ФиксированнойСуммой Тогда
Результат = Запись. Размер;
ИначеЕсли
СпособРасчета = Перечисления. СпособыРасчета. ПоСдельнойВыработке Тогда
Результат = ДанныеДляРасчета. Выработка; КонецЕсли ;
Запись. Результат = Результат * ? ( Запись. Сторно, - 1 , 1 ) ;
КонецПроцедуры
При расчете записей следует учитывать, что сторно-записи рассчитываются в общем порядке. Поэтому в ресурсы сторно-записи должно попадать отрицательное значение результата расчета. Например, сторно- запись отменяет начисленный оклад за период 5 дней. При расчете такой записи по формуле система получит сумму оклада за 5 дней, например, 1200 руб. В ресурс сторно-записи в этом случае должно быть записано значение -1200.
Категория:
Регистры расчета Как получить ПредопределенноеЗначение? Чтобы обратиться к предопределенному значению перечисления на клиенте нужно использовать метод глобального контекста ПредопределенноеЗначение (PredefinedValue)
Синтаксис:
Код 1C v 8.2 УП ПредопределенноеЗначение( < ИмяПредопределенногоЗначения> )
Параметры: <ИмяПредопределенногоЗначения> (обязательный)
Тип: Строка. Содержит полный путь до предопределенного значения, включая имя самого значения. Например, "ПланСчетов.Основной.Счет41".
Синтаксис описания предопределенного значения совпадает с синтаксисом оператора ЗНАЧЕНИЕ языка запросов:
<Тип предопределенного значения>.<Имя объекта метаданных>.<Значение>
Тип предопределенного значения> может быть:
Справочник (Catalog);
ПланВидовХарактеристик (ChartOfCharacteristicTypes);
ПланСчетов (ChartOfAccounts);
ПланВидовРасчета (ChartOfCalculationTypes);
Перечисление (Enum);
БизнесПроцесс (BusinessProcess)
В качестве <Имя объекта метаданных> указывается имя объекта метаданных, как оно задано в конфигураторе.
Для перечислений, определенных в конфигурации, <Значение> указывается как имя соответствующего объекта метаданных типа ЗначениеПеречисления. Для всех остальных типов предопределенных значений <Значение> указывается как имя предопределенного элемента данных, как оно указано в конфигураторе, или ПустаяСсылка для указания пустой ссылки.
Для точек маршрутов бизнес-процессов имя предопределенного значения имеет вид:
БизнесПроцесс.<Имя объекта метаданных>.ТочкаМаршрута.<Имя точки маршрута>
Также метод может быть использован для получения значения системного перечисления. В этом случае параметр формируется как:
<ИмяСистемногоПеречисления>.<ИмяЗначенияСистемногоПеречисления>
Описание: Возвращает ссылку на предопределенный элемент из предопределенных данных, прикладных перечислений и точек маршрута бизнес-процессов, а также значения системных перечислений.
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Вызов метода выполняет обращение к серверу.
Код 1C v 8.2 УП &Наклиенте
Процедура ГрафикРемонтовСпособВыполненияПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы. ГрафикРемонтов. ТекущиеДанные;
Если СтрокаТабличнойЧасти. СпособВыполнения = ПредопределенноеЗначение( "Перечисление.СпособыВыполненияРемонтныхРабот.Подрядный" ) Тогда
Элементы. ГрафикРемонтовИсполнитель. ОграничениеТипа = Новый ОписаниеТипов( "СправочникСсылка.Контрагенты" ) ;
иначе
Элементы. ГрафикРемонтовИсполнитель. ОграничениеТипа = Новый ОписаниеТипов( "СправочникСсылка.ПодразделенияОрганизации" ) ;
КонецЕсли ;
КонецПроцедуры
Программируя функционал в платформе 8.2 Управляемые Формы нужно четко понимать где он будет исполняться (на сервере или клиенте). Многие привычные методы теперь не работают так как раньше. И элементарная проверка заполнения реквизита на предопределенное значение на клиенте будет иметь следующий вид:
Код 1C v 8.х &НаКлиенте
Процедура ПриИзменениеСтатусаЗаказа()
Если Объект. Статус = ПредопределенноеЗначение( "Перечисление.СтатусыЗаказов.Завершен" ) Тогда
ЗакрытьЗаказ( ) ;
КонецЕсли ;
КонецПроцедуры
Вот так работать не будет:
Код 1C v 8.х
&НаКлиенте
Процедура ПриИзменениеСтатусаЗаказа()
Если Объект. Статус = Перечисления. СтатусыЗаказов. Завершен Тогда
ЗакрытьЗаказ( ) ;
КонецЕсли ;
КонецПроцедуры
Категория:
Встроенные Функции Как сформировать новый документ на основании файла, шаблона Microsoft Office Word и OpenOffice? Код 1C v 8.х Перем СсылкаНаДокумент;
Процедура СформироватбФайл_MS_Word_И_OpenOffice(Кнопка)
ДокументСсылка = СсылкаНаДокумент;
ИмяФайла = ПолучитьИмяВременногоФайла( ) ;
Попытка
MSWord = новый COMОбъект( "Word.Application" ) ;
MSWord. Documents. Open( ИмяФайла) ;
MSWordDoc = MSWord. ActiveDocument( ) ;
WordContent = MSWord. ActiveDocument( ) . ActiveWindow. S_election;
Для ТекущаяТаблица = 1 ПО MSWordDoc. Tables. Count Цикл
мТабличнаяЧасть = Неопределено ;
Для ТекущаяСтрока = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Rows. Count Цикл
Для ТекущаяКолонка = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Columns. Count Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока, ТекущаяКолонка) . Range. Text )
, ДокументСсылка) ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
ВсегоСтрокТЧ = 0 ;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть. Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+ 1 ;
КонецЦикла ;
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
MSWordDoc. Tables( ТекущаяТаблица) . Rows. Add( MSWordDoc. Tables( ТекущаяТаблица) . Rows( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) ) ;
КонецЕсли ;
Для ТекКол = 1 ПО MSWordDoc. Tables( ТекущаяТаблица) . Columns. Count Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ, ТекКол) . Range. Text) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
MSWordDoc. Tables( ТекущаяТаблица) . Cell( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , ТекКол) . Range. Text = ТекстПеременной;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ТекстДокумента = MSWordDoc. Range( 0 , MSWordDoc. Characters. Count) . Text;
Список = ПолучитьСписокПеременных( ТекстДокумента) ;
СтруктураРеквизитов= СтруктураРеквизитовДокумента( ДокументСсылка) ;
ЗначениеРеквизита= "" ;
Для Каждого ЭлементСписка Из Список Цикл
Если СтруктураРеквизитов. Свойство( ЭлементСписка. Значение, ЗначениеРеквизита ) Тогда
WordContent. Find. Execute( "[" + ЭлементСписка. Значение+ "]" , 0 , 0 , 0 , 0 , 0 , - 1 , , , Строка( ЗначениеРеквизита) , 2 ) ;
Иначе
Сообщить( "-> " + ЭлементСписка. Значение+ " - Не найден в структуре документа" ) ;
WordContent. Find. Execute( "[" + ЭлементСписка. Значение+ "]" , 0 , 0 , 0 , 0 , 0 , - 1 , , , " " , 2 ) ;
КонецЕсли ;
КонецЦикла ;
MSWord. S_election. WholeStory( ) ;
MSWord. S_election. Fields. Update( ) ;
MSWord. S_election. HomeKey( ) ;
MSWord. Visible= 1 ;
MSWord. Activate( ) ;
Исключение
Предупреждение( ОписаниеОшибки( ) ) ;
MSWord. Quit( ) ;
КонецПопытки ;
Попытка
ServiceManager = Новый COMОбъект( "com.sun.star.ServiceManager" ) ;
Reflection = ServiceManager. createInstance( "com.sun.star.reflection.CoreReflection" ) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
Args = Новый COMSafeArray( "VT_DISPATCH" , 1 ) ;
OOДокумент = Desktop. loadComponentFromURL( ПреобразоватьВURL( ИмяФайла) , "_blank" , 0 , Args) ;
Для ТекущаяТаблица = 0 ПО OOДокумент. getTextTables( ) . Count- 1 Цикл
мТабличнаяЧасть = Неопределено ;
Для ТекущаяСтрока = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. Count- 1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекущаяКолонка, ТекущаяСтрока) . string )
, ДокументСсылка) ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
Прервать ; ;
КонецЕсли ;
КонецЦикла ;
Если мТабличнаяЧасть < > Неопределено Тогда
ВсегоСтрокТЧ = 0 ;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть. Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+ 1 ;
КонецЦикла ;
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. I_nsertByIndex( ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 , 1 ) ;
КонецЕсли ;
Для ТекКол = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
Если ТекущаяСтрокаТЧ < > ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ) . string) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки( СокрЛП( OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string) ) ;
ТекстПеременной = ? ( ПустаяСтрока( ТекстПеременной) , "" , "[" + "_" + Строка( ТекущаяСтрокаТЧ) + "_" + ТекстПеременной+ "]" ) ;
OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекКол, ТекущаяСтрока+ ТекущаяСтрокаТЧ- 1 ) . string = ТекстПеременной;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ТекстДокумента = ООПолучитьТекст( OOДокумент) ;
Список = ПолучитьСписокПеременных( ТекстДокумента) ;
СтруктураРеквизитов= СтруктураРеквизитовДокумента( ДокументСсылка) ;
ЗначениеРеквизита= "" ;
OOЗамена = OOДокумент. CreateReplaceDescriptor( ) ;
Для Каждого ЭлементСписка Из Список Цикл
Если СтруктураРеквизитов. Свойство( ЭлементСписка. Значение, ЗначениеРеквизита ) Тогда
OOЗамена. SearchString = "[" + ЭлементСписка. Значение+ "]" ;
OOЗамена. ReplaceString = Строка( ЗначениеРеквизита) ;
OOДокумент. ReplaceAll( OOЗамена) ;
Иначе
Сообщить( "-> " + ЭлементСписка. Значение+ " - Не найден в структуре документа" ) ;
OOЗамена. SearchString = "[" + ЭлементСписка. Значение+ "]" ;
OOЗамена. ReplaceString = " " ;
OOДокумент. ReplaceAll( OOЗамена) ;
КонецЕсли ;
КонецЦикла ;
OOДокумент. getCurrentController( ) . getFrame( ) . getContainerWindow( ) . setFocus( ) ;
Исключение
Предупреждение( ОписаниеОшибки( ) ) ;
КонецПопытки ;
КонецПроцедуры
Код 1C v 8.х
Процедура ДобавитьФорматы(ПереченьРеквизитов,Значение,пПредставлениеРеквизита, ДокументСсылка = Неопределено)
Если ТипЗнч( Значение) = Тип( "Дата" ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ДФddMMyyyy" , Формат( Значение, "ДФ=dd.MM.yyyy" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ДЛФDD" , Формат( Значение, "ДЛФ=DD" ) ) ;
ИначеЕсли ТипЗнч( Значение) = Тип( "Число" ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧДЦ2ЧГ0" , Формат( Значение, "ЧДЦ=2; ЧГ=0" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧДЦ2" , Формат( Значение, "ЧДЦ=2" ) ) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ЧПропись" , Значение) ;
ИначеЕсли ( ТипЗнч( Значение) = Тип( "СправочникСсылка.КонтактныеЛица" ) ) или ( ТипЗнч( Значение) = Тип( "СправочникСсылка.ФизическиеЛица" ) ) Тогда
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "ФИО" , Строка( Значение) ) ;
КонецЕсли
КонецПроцедуры
Процедура ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,РеквизитСсылка,Реквизит,пПредставлениеРеквизита)
мГлубинаРекурсии = мГлубинаРекурсии+ 1 ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "Код" , РеквизитСсылка["Код" ]) ;
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + "Наименование" , РеквизитСсылка["Наименование" ]) ;
Для Каждого ЭлементРеквизита Из Реквизит. Реквизиты Цикл
ПереченьРеквизитов. Вставить( пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя, РеквизитСсылка[ЭлементРеквизита. Имя]) ;
Если ( Найти( ЭлементРеквизита. Тип, "Справочник ссылка" ) > 0 ) И ( мГлубинаРекурсии < = 3 ) И ( Найти( ЭлементРеквизита. Тип, "," ) = 0 ) Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, РеквизитСсылка[ЭлементРеквизита. Имя], РеквизитСсылка[ЭлементРеквизита. Имя]. Метаданные( ) , пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя) ;
Иначе
ДобавитьФорматы( ПереченьРеквизитов, РеквизитСсылка[ЭлементРеквизита. Имя], пПредставлениеРеквизита+ "_" + ЭлементРеквизита. Имя) ;
КонецЕсли
КонецЦикла ;
КонецПроцедуры
Функция ПолучитьСписокПеременных(ТекстШаблона)
СписокПеременных = Новый СписокЗначений( ) ;
ЕщеЕсть = Истина ;
Пока ЕщеЕсть Цикл
ПервыйСимвол = Найти( ТекстШаблона, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ТекстШаблона, "]" ) ;
Если ( ВторойСимвол > 0 И ВторойСимвол > ПервыйСимвол) Тогда
СписокПеременных. Добавить( Сред( ТекстШаблона, ПервыйСимвол + 1 , ВторойСимвол - ПервыйСимвол - 1 ) ) ;
ТекстШаблона = Сред( ТекстШаблона, ВторойСимвол + 1 ) ;
Иначе
ЕщеЕсть = Ложь ;
КонецЕсли ;
Иначе
ЕщеЕсть = Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат СписокПеременных;
КонецФункции
Функция СтруктураРеквизитовДокумента(ДокументСсылка) Экспорт
ПереченьРеквизитов = Новый Структура;
ПереченьРеквизитов. Вставить( "Дата" , ДокументСсылка["Дата" ]) ;
ДобавитьФорматы( ПереченьРеквизитов, ДокументСсылка["Дата" ], "Дата" ) ;
ПереченьРеквизитов. Вставить( "Номер" , ДокументСсылка["Номер" ]) ;
Реквизиты = ДокументСсылка. Метаданные( ) . Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
мГлубинаРекурсии = 1 ;
ПереченьРеквизитов. Вставить( Реквизит. Имя, ДокументСсылка[Реквизит. Имя]) ;
ДобавитьФорматы( ПереченьРеквизитов, ДокументСсылка[Реквизит. Имя], Реквизит. Имя, ДокументСсылка) ;
Если Найти( Реквизит. Тип, "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, ДокументСсылка[Реквизит. Имя], ДокументСсылка[Реквизит. Имя]. Метаданные( ) , Реквизит. Имя) ;
Иначе
КонецЕсли ;
КонецЦикла ;
ТабличныеЧасти = ДокументСсылка. Метаданные( ) . ТабличныеЧасти;
Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
Если ТабличнаяЧасть. Имя = "Характеристики" Тогда
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть. Имя] Цикл
мПредставлениеРеквизита = "Характеристика" + "_" + СтрЗаменить( СтрокаТабличнойЧасти["ВидХарактеристики" ], " " , "_" ) ;
мЗначение = СтрокаТабличнойЧасти["ЗначениеХарактеристики" ];
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
Если Найти( ТипЗнч( мЗначение) , "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, мЗначение, мЗначение. Метаданные( ) , мПредставлениеРеквизита) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
Реквизиты = ТабличнаяЧасть. Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть. Имя] Цикл
мГлубинаРекурсии = 1 ;
мПредставлениеРеквизита = "_" + СтрокаТабличнойЧасти. НомерСтроки+ "_" + ТабличнаяЧасть. Имя+ "_НомерСтроки" ;
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, Строка( СтрокаТабличнойЧасти. НомерСтроки) ) ;
мПредставлениеРеквизита = "_" + СтрокаТабличнойЧасти. НомерСтроки+ "_" + ТабличнаяЧасть. Имя+ "_" + Реквизит. Имя;
мЗначение = СтрокаТабличнойЧасти[Реквизит. Имя];
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
Если Найти( ТипЗнч( мЗначение) , "Справочник ссылка" ) > 0 Тогда
ЗаполнитьРеквизиты( мГлубинаРекурсии, ПереченьРеквизитов, мЗначение, мЗначение. Метаданные( ) , мПредставлениеРеквизита) ;
Иначе
КонецЕсли ;
КонецЦикла ;
Если Реквизит. Тип. СодержитТип( Тип( "Число" ) ) Тогда
мЗначение = ДокументСсылка[ТабличнаяЧасть. Имя]. Итог( Реквизит. Имя) ;
мПредставлениеРеквизита = "Итог" + "_" + ТабличнаяЧасть. Имя+ "_" + Реквизит. Имя;
ПереченьРеквизитов. Вставить( мПредставлениеРеквизита, мЗначение) ;
ДобавитьФорматы( ПереченьРеквизитов, мЗначение, мПредставлениеРеквизита, ДокументСсылка) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
Возврат ПереченьРеквизитов;
КонецФункции
Функция ИмяТабличнойЧастиВСтроке(Строка,ДокументСсылка)
ТабличнаяЧасть= Неопределено ;
Если НЕ ПустаяСтрока( Строка) Тогда
ТабличнаяЧасть = ДокументСсылка. Метаданные( ) . ТабличныеЧасти. Найти( Строка)
КонецЕсли ;
Возврат ТабличнаяЧасть;
КонецФункции
Функция ПолучитьСтартПеременной(ПереданнаяСтрока) Экспорт
СтартПеременной = "" ;
ПервыйСимвол = Найти( ПереданнаяСтрока, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ПереданнаяСтрока, "]" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > ПервыйСимвол) Тогда
Переменная = ( Сред( ПереданнаяСтрока, ПервыйСимвол+ 1 , ВторойСимвол- ПервыйСимвол- 1 ) ) ;
ВторойСимвол = Найти( Переменная, "_" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > 1 ) Тогда
СтартПеременной = Сред( Переменная, 1 , ВторойСимвол- 1 ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Возврат СтартПеременной;
КонецФункции
Функция ПолучитьПеременнуюИзСтроки(ПереданнаяСтрока) Экспорт
Переменная = "" ;
ПервыйСимвол = Найти( ПереданнаяСтрока, "[" ) ;
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти( ПереданнаяСтрока, "]" ) ;
Если ( ВторойСимвол > 0 ) И ( ВторойСимвол > ПервыйСимвол) Тогда
Переменная = ( Сред( ПереданнаяСтрока, ПервыйСимвол+ 1 , ВторойСимвол- ПервыйСимвол- 1 ) ) ;
КонецЕсли ;
КонецЕсли ;
Возврат Переменная;
КонецФункции
Функция ПреобразоватьВURL(ИмяФайла)
Возврат "file:///" + СтрЗаменить( ИмяФайла, "\" , "/" ) ;
КонецФункции
Функция ООПолучитьТекст(OOДокумент)
Текст = "" ;
oParEnum = OOДокумент. getText( ) . createEnumeration( ) ;
Пока oParEnum. hasMoreElements( ) Цикл
oPar = oParEnum. nextElement( ) ;
Если oPar. supportsService( "com.sun.star.text.Paragraph" ) ТОгда
Текст = Текст + oPar. getString( ) ;
ИначеЕсли oPar. supportsService( "com.sun.star.text.TextTable" ) Then
КонецЕсли ;
КонецЦикла ;
Для ТекущаяТаблица = 0 ПО OOДокумент. getTextTables( ) . Count- 1 Цикл
Для ТекущаяСтрока = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Rows. Count- 1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . Columns. Count- 1 Цикл
Текст = Текст + OOДокумент. getTextTables( ) . getByIndex( ТекущаяТаблица) . getCellByPosition( ТекущаяКолонка, ТекущаяСтрока) . string;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
Возврат Текст;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice