О формате EnterpriseData Для облегчения интеграции с программными продуктами фирмы «1С» разработан формат обмена данными EnterpriseData. Формат основан на XML и является бизнес-ориентированным – описанные в нем структуры данных соответствуют бизнес-сущностям (документам и элементам справочников), представленным в программах «1С», например: акт выполненных работ, приходный кассовый ордер, контрагент, договор и т. п. Это делает формат интуитивно понятным и легким в использовании.
Формат EnterpriseData предназначен для обмена данными внутри компании (в том числе между разнородными и территориально удаленными информационными системами) и призван покрыть все сферы деятельности предприятия – финансы, производство, закупки и продажи, складские операции и т. п.
Описание формата Версия 1.0.1 формата включает в себя описание 94 типов бизнес-сущностей из различных областей бизнеса (подробное описание формата можно найти здесь). Формат является расширяем ым – фирма «1С» будет добавлять в него описание новых бизнес-сущностей и расширять существующие сущности новыми полями. Поддержка формата в продуктах фирмы «1С» обеспечивает совместимость снизу вверх – все программы сторонних производителей, обменивающихся данными в формате EnterpriseData с продуктами «1С», при выходе новых версий формата корректно продолжат работу.
Формат предназначен для обмена информацией между любыми информационными системами: он не зависит от особенностей собственного программного обеспечения или структур информационных баз, которые участвуют в обмене и не содержит в себе явных ограничений использования.
Обмен данными с программами «1С» Предварительная настройка на стороне «1С»
Чтобы начать обмен данными в формате EnterpriseData между приложением «1С» и сторонним приложением, надо на стороне «1С» настроить синхронизацию данных. В ходе настройки указывается уникальный код приложения, с которым будет производиться обмен, а также по какому каналу будет происходить обмен данными. В настоящий момент доступны следующие опции:
веб-сервис, файловый обмен через каталог, файловый обмен через FTP. Обмен через электронную почту
В случае обмена через веб-сервис стороннее приложение будет инициировать сеанс обмена данными путем вызова соответствующих веб-методов приложения «1С». В остальных случаях инициатором сеанса обмена будет приложение «1С».
Также на стороне «1С» настраивается, с какой периодичностью будет происходить синхронизация (для вариантов с файловым обменом через каталог и электронную почту):
по расписанию (с заданной периодичностью);
вручную; пользователь должен будет вручную запускать синхронизацию каждый раз, когда это ему потребуется.
Формат файлов обмена
В ходе синхронизации приложения «1С» и сторонние приложения обмениваются сообщениями – XML-файлами определенной структуры. Эти файлы состоят из двух секций – <Header> и <Body>. Секция <Header> содержит сообщение-квитанцию <Confirmation> (о ней ниже), а <Body> – информацию об измененных бизнес-сущностях в формате EnterpriseData.
Подробнее на сайте 1С
Категория:
Конвертация данных, Обмен, Перенос Расширяем возможности Конфигуратора После выхода «1С Предприятие 8.3.5″ пришлось забыть об использовании Снегопата.
Желание обустроить конфигуратор под себя осталось, в итоге реанимировал свой старый проект основанный на Autohotkey + JScript.
Итогом стал проект на github: v8CfgAddsAhk
Установка Установить Autohotkey (http://www.autohotkey.com/)
Зарегистрировать библиотеки:
v8CfgAddsAhk\system\svcsvc.dll
v8CfgAddsAhk\system\WshExtra.dll
Запуск v8CfgAddsAhk\v8CfgAdds.ahk (Основной набор скриптов)
v8CfgAddsAhk\continueRow.ahk (Операции по переносу комментариев, строк). Автор ADirks
Реализованные функции Вызов списка процедур: {ctrl +1}
Поиск с регулярными выражениями: {Alt+f}
Поиск с регулярными выражениями (результат последнего поиска): {Alt+r}
Генератор кода для объектов метаданных (требуется предварительная генерация файла структуры обработкой v8CfgAddsAhk\ext\ПолучениеСтруктуры.epf): {Alt+g}
Добавление ссылки на основной реквизит в модуле (преобразование модуля формы из обычных форм в управляемые формы): {Alt+h}
Авторские комментарии:
блок добавлен: {alt+s}
блок изменен: {alt+e}
блок удален: {alt+d}
Закоментировать строку: {ctrl + / (ctrl + .)}
Развернуть модуль: {ctrl+i}
Удаление строки: {Ctrl+y}
Cимвол ‘<‘: {Ctrl-,} - Cимвол ‘>': {Ctrl-.}
Cимвол ‘|': {Ctrl-\}
Копирование текущей строки и вставка в следующей: {ctrl+shift+c}
Переход в процедуру: {ctrl+enter}
Возврат на предыдущую позицию: {Alt,-}
Препроцессор функции: {Alt+7}
Форматирование модуля: {F6} (code_beautifier.pl - ADirks)
Примеры работы скриптов
Источник: Жизнь без Снегопата (расширяем конфигуратор)
Категория:
Полезные, Универсальные Функции Как программно установить отбор в открываемой форме(При открытии)? Для установки отбора используется свойство "Отбор" у менеджеров списков объектов, например, для открытия списка договоров определенного контрагента можно написать следующий код:
Код 1C v 8.х ФормаВыбора = Справочники.ДоговорыКонтрагентов.ПолучитьФормуВыбора("ФормаВыбора", ЭтаФорма, "ФормаВыбораДоговора");
ФормаВыбора.Отбор.Владелец.Значение = КонтрагентСсылка;
ФормаВыбора.Отбор.Владелец.Использование = ИСТИНА;
ФормаВыбора.ОткрытьМодально();
В данном случае мы применили вид сравнения "Равно", но не указывали его т.к. оно стоит по умолчанию. Используя разные значения вида сравнения мы значительно расширяем возможности.
Например, у нас в базе контрагент является и продавцом и покупателем, при этом договоры находятся в соответствующей группе внутри справочника. Поэтому мы сделаем отбор не только на самого контрагента, но и на группу "Группа Покупатели" в которой находится договор:
Код 1C v 8.х ФормаВыбора = Справочники.ДоговорыКонтрагентов.ПолучитьФормуВыбора("ФормаВыбора", ЭтаФорма, "ФормаВыбораДоговора");
ФормаВыбора.Отбор.Владелец.Значение = КонтрагентСсылка;
ФормаВыбора.Отбор.Владелец.Использование = ИСТИНА;
ГруппаПокупатели = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Группа Покупатели");
ФормаВыбора.Отбор.Родитель.ВидСравнения = ВидСравнения.ВИерархии;
ФормаВыбора.Отбор.Родитель.Значение = ГруппаПокупатели;
ФормаВыбора.Отбор.Родитель.Использование = ИСТИНА;
ФормаВыбора.ОткрытьМодально();
Категория:
Работа с Формой (Диалог) и её элементами Как сформировать новый документ на основании файла, шаблона Microsoft Office Word и OpenOffice? Код 1C v 8.х Перем СсылкаНаДокумент;
Процедура СформироватбФайл_MS_Word_И_OpenOffice(Кнопка)
ДокументСсылка = СсылкаНаДокумент;
ИмяФайла = ПолучитьИмяВременногоФайла();
// Теперь формируем файл из MS Wordа
Попытка
MSWord = новый COMОбъект("Word.Application");
//Передаем текущие параметры форм в MSWord
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));
КонецЕсли;
//MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,2).Range.Text = Строка(ТекущаяСтрокаТЧ);
Для ТекКол = 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.Tables(ТекущаяТаблица).Rows.Delete();
//MSWordDoc.Tables(ТекущаяТаблица).Rows(3).Delete();
КонецЕсли;
КонецЦикла;
//------------------------------------------------------------
// Вытаскивам из шаблона текст
ТекстДокумента = 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();
//MSWordDoc.SaveAs(ИмяФайла);
//отображаем MSWord
MSWord.Visible=1;
MSWord.Activate();
Исключение
Предупреждение(ОписаниеОшибки());
MSWord.Quit();
КонецПопытки;
// Теперь формируем файл из OpenOffice
Попытка
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 = ТекстПеременной;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
//------------------------------------------------------------
// Вытаскивам из шаблона текст
//ТекстДокумента = MSWordDoc.Range(0, MSWordDoc.Characters.Count).Text;
ТекстДокумента = ООПолучитьТекст(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));
КонецЕсли;
КонецЕсли;
Возврат Переменная;
КонецФункции// Идентифицирует табличную часть в строке
// Функция преобразует Windows имя файла в URL OpenOffice
Функция ПреобразоватьВ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
//Сообщить(oPar.getString());
КонецЕсли;
КонецЦикла;
Для ТекущаяТаблица = 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 Как получить уникальный идентификатор объекта, GUID? GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать
расширяем ые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,402 * 10в38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х ГУИДССЫЛКИ = СсылкаНаОбъект.УникальныйИдентификатор();
// или
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("00013");
Если НЕ НоменклатураСсылка.Пустая() Тогда
Сообщить("GUID = " + НоменклатураСсылка.УникальныйИдентификатор());
КонецЕсли;
Как с помощью запроса получить уникальный идентификатор:
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.НаименованиеПолное,
| Номенклатура.ЕдиницаИзмерения,
| Номенклатура.СтавкаНДС,
| Номенклатура.НоменклатурнаяГруппа,
| Номенклатура.СчетУчетаЗапасов,
| Номенклатура.СчетУчетаЗатрат,
| Номенклатура.Ссылка,
| Номенклатура.ЭтоГруппа
| ИЗ
| Справочник.Номенклатура КАК Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
СпрОбъект = РезультатЗапроса.Выбрать();
Пока СпрОбъект.Следующий() Цикл
СтрокаУИ = Объект.XMLСтрока(СпрОбъект.Ссылка);
GUID = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СокрЛП(СтрокаУИ)));
КонецЦикла;
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x Инфо = СоздатьОбъект("AddIn.V7SysInfo");
ГлобальноУникальныйИдентификатор = Инфо.СоздатьGUID();
Через WScript
Код 1C v 7.x Функция СоздатьGUID()
TypeLib = CreateObject("Scriptlet.TypeLib");
NewGUID = TypeLib.Guid();
TypeLib = "";
Возврат NewGUID;
КонецФункции
//*******************************************
Процедура Сформировать()
g=СоздатьGUID();
Сообщить("Создан GUID: "+g);
КонецПроцедуры
при OLE доступе:
Код 1C v 7.x Если Док_Источник.ВыбратьДокументы(ВыбНачПериода,ВыбКонПериода) = 1 Тогда
Пока Док_Источник.ПолучитьДокумент() = 1 Цикл
Объект = БазаОле.ЗначениеВстрокуВнутр(Док_Источник.ТекущийДокумент());
ИдентификаторДокумента = СокрЛП(ПолучитьИД(Объект));
// Для примера Объект возвращает {"O","0","0","3114","0","0"," 258156CB "},
// а ПолучитьИД(объект) = 258156CB
КонецЦикла;
Еще посмотрите метод:
ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> - значение объекта агрегатного типа данных которое нужно преобразовать.
Категория:
Встроенные Функции