18. Интеграция 1С

Текстовый файл

Как выгрузить данные из справочника в текстовый файл?

Текст = Новый ТекстовыйДокумент; Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Стр = СтрЗаменить(Выборка.Наименование, Символ(34), "%квч%"); Код = Строка(Выборка.Код) + Символ(34); Текст.ДобавитьСтроку(Код + Стр); КонецЦикла; Текст.Записать("c:\temp\text.txt");

Как загрузить данные из текстового файла?

Текст = Новый ТекстовыйДокумент; Текст.Прочитать("c:\temp\text.txt"); Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл Стр = Текст.ПолучитьСтроку(НомерСтроки); Позиция = Найти(Стр, Символ(34)); Код = Сред(Стр, 1, Позиция-1); прНаименование = Сред(Стр, Позиция + 1); Наименование = СтрЗаменить(прНаименование, "%квч%", Символ(34)); Сообщить(Код + "-" + Наименование); КонецЦикла;

Работа с текстом. Модель последовательного доступа

Путь = "c:\temp\text.txt"; Текст = Новый ЗаписьТекста(Путь, КодировкаТекста.UTF8); Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Текст.ЗаписатьСтроку(Выборка.Наименование); КонецЦикла; Текст.Закрыть(); Путь = "c:\temp\text.txt"; Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8); Стр = Текст.ПрочитатьСтроку(); Пока Стр <> Неопределено Цикл Стр = Текст.ПрочитатьСтроку(); Сообщить(Стр); КонецЦикла;

XML

Как из одной базы перенести документ в другую базу?

// Выгрузить в файл xml. ЗаписьXML=Новый ЗаписьXML(); ЗаписьXML.ОткрытьФайл("c:\doc.xml"); ЗаписьXML.ЗаписатьНачалоЭлемента("Root"); // Получить объект по ссылке. ВыгружаемыйОбъект=Документ.ПолучитьОбъект(); // С помощью средств сериализации записать объект в файл. ЗаписатьXML(ЗаписьXML,ВыгружаемыйОбъект); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.Закрыть(); ЧтениеXML=Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл("c:\doc.xml"); // Текущим становится элемент Root. ЧтениеXML.Прочитать(); // Текущим становится элемент с документом. ЧтениеXML.Прочитать(); // Проверить сможет ли с данным значением "справиться" // система сериализации в данной базе. Если ВозможностьЧтенияXML(ЧтениеXML) Тогда // Получить ДокументОбъект.РеализацияТоваровУслуг ЗагружаемыйОбъект=ПрочитатьXML(ЧтениеXML); ЗагружаемыйОбъект.Записать(); КонецЕсли; ЧтениеXML.Закрыть();

Как можно сформировать XML-документ произвольной структуры?

Запись = Новый ЗаписьXML; Запись.ОткрытьФайл(ПутьКФайлу); Запись.ЗаписатьОбъявлениеXML(); Запись.ЗаписатьНачалоЭлемента("Корневой"); Запись.ЗаписатьАтрибут("Справочник", "Номенклатура"); Запись.ЗаписатьКомментарий("Краткая информация о номенклатуре"); Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Продолжить; КонецЕсли; Запись.ЗаписатьНачалоЭлемента("Элемент"); Запись.ЗаписатьАтрибут("Код", Строка(Выборка.Код)); Запись.ЗаписатьАтрибут("Артикул", Строка(Выборка.Артикул)); Запись.ЗаписатьТекст(Выборка.Наименование); Запись.ЗаписатьКонецЭлемента(); КонецЦикла; Запись.ЗаписатьКонецЭлемента(); Запись.Закрыть();

Как сформировать XML-документ в строку?

Запись = Новый ЗаписьXML(); Запись.УстановитьСтроку(); Запись.ЗаписатьОбъявлениеXML(); Запись.ЗаписатьНачалоЭлемента("Корневой"); Запись.ЗаписатьАтрибут("Справочник", "Номенклатура"); Запись.ЗаписатьКомментарий("Краткая информация о номенклатуре"); Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Продолжить; КонецЕсли; Запись.ЗаписатьНачалоЭлемента("Элемент"); Запись.ЗаписатьАтрибут("Код", Строка(Выборка.Код)); Запись.ЗаписатьАтрибут("Артикул", Строка(Выборка.Артикул)); Запись.ЗаписатьТекст(Выборка.Наименование); Запись.ЗаписатьКонецЭлемента(); КонецЦикла; Запись.ЗаписатьКонецЭлемента(); Стр = Запись.Закрыть(); Сообщить(Стр);

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

ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); Данные = СсылкаНаДокумент.ПолучитьОбъект(); ЗаписатьXML(ЗаписьXML, Данные); ТекстСообщения = ЗаписьXML.Закрыть(); Текст = Новый ТекстовыйДокумент; Текст.УстановитьТекст(ТекстСообщения); Текст.Записать(ПутьКФайлу); Текст = Новый ТекстовыйДокумент; Текст.Прочитать(ПутьКФайлу); ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(Текст.ПолучитьТекст()); Если ВозможностьЧтенияXML(ЧтениеXML) Тогда Данные = ПрочитатьXML(ЧтениеXML); Данные.Записать(); КонецЕсли;

Как можно загрузить XML документ произвольной структуры?

Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл(ПутьКФайлу); Пока Чтение.Прочитать() Цикл // Прочитать "структурные части" элементов. // Проверить, какая часть элемента - текущая. Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ИмяУзла = Чтение.Имя; Сообщить("--" + ИмяУзла); // Атрибуты элементов можно читать только если текущая часть - // начало элемента Пока Чтение.ПрочитатьАтрибут() Цикл // Прочитать данные узла атрибута. ТипУзла = Чтение.ТипУзла; Имя = Чтение.Имя; Значение = Чтение.Значение; // Обработать полученные значения. КонецЦикла; ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда // В примере просто выводим текст в окно сообщений. Сообщить("Текст:" + Чтение.Значение); ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда // В примере просто выводим признак конца элемента // в окно сообщений Сообщить("--Конец:" + Чтение.Имя); КонецЕсли; КонецЦикла;

DBF-файлы

Как можно построить выгрузку-загрузку посредством файлов DBF?

БД = Новый XBase; БД.Поля.Добавить("CODE", "S", 5); БД.Поля.Добавить("NAME", "S", 40); БД.СоздатьФайл(Путь + "start.dbf", Путь + "index.cdx"); БД.Индексы.Добавить("IDXCODE", "CODE"); ФлИБД = БД.СоздатьИндексныйФайл(Путь + "index.cdx"); БД.АвтоСохранение = Истина; Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл БД.Добавить(); БД.CODE = Выборка.Код; БД.NAME = Выборка.Наименование; КонецЦикла; БД.ЗакрытьФайл(); БД = Новый XBase; БД.ОткрытьФайл(Путь + "start.dbf", Путь + "index.cdx"); БД.ТекущийИндекс = БД.Индексы.IDXCODE; Пока БД.Следующая() Цикл Сообщить(БД.CODE); Сообщить(БД.NAME); КонецЦикла; БД.ЗакрытьФайл();

Управляемые формы

Чтение DBF файла

&НаКлиенте

Процедура ПрочитатьФайл(Команда)

ПрочитатьФайлНаСервере();

КонецПроцедуры

&НаСервере

Процедура ПрочитатьФайлНаСервере()

ПутьКФайлу = "D:\dbf.DBF";

ФайлDBF = Новый XBase;

ФайлDBF.ОткрытьФайл(ПутьКФайлу, , Истина); // открытие файла

ФайлDBF.Первая(); // устанавливает курсор на первую запись

Пока НЕ ФайлDBF.ВКонце() Цикл

Если Не ФайлDBF.ЗаписьУдалена() Тогда

// ФайлDBF[ИмяПоля№1]

// ФайлDBF.ИмяПоля№1

КонецЕсли;

// Произвольный алгоритм

КонецЦикла;

// После чтения обязательно закрываем файл

ФайлDBF.ЗакрытьФайл();

КонецПроцедуры

Создание и запись DBF файла

&НаКлиенте

Процедура ЗаписьФайлаDBF(Команда)

ЗаписьФайлаDBFНаСервере();

КонецПроцедуры

&НаСервере

Процедура ЗаписьФайлаDBFНаСервере()

ФайлDBF = Новый XBase;

ФайлDBF.Кодировка = КодировкаXBase.ANSI;

// Создаем описание колонок

ФайлDBF.Поля.Добавить("ColNum1", "S", 100);

ФайлDBF.Поля.Добавить("ColNum2", "N", 10) ;

ПутьФайла = "D:\dbf.DBF";

ФайлDBF.СоздатьФайл(ПутьФайла);

ФайлDBF.Записать();

Для Индекс = 1 По 10 Цикл

ФайлDBF.Добавить();

ФайлDBF.ColNum1 = "Значение колонки " + Индекс;

ФайлDBF.ColNum2 = Индекс;

ФайлDBF.Записать();

КонецЦикла;

ФайлDBF.ЗакрытьФайл();

КонецПроцедуры

Работа с HTML-документами

Заполнение HTML-анкет

Фамилия

Имя

Отчество

Процедура URLПриИзменении(Элемент) ЭлементыФормы.ПолеHTML.Перейти(URL); КонецПроцедуры Процедура ПолеHTMLДокументСформирован(Элемент) // Событие возникает и при открытии формы, когда в реквизите // URL содержится пустая строка. Если URL <> "" Тогда Док = ЭлементыФормы.ПолеHTML.Документ; // При попытке обратиться к несуществующему свойству // произойдет ошибка Док.forms["frm"].fam.Value = "Иванов"; Док.forms["frm"].nam.Value = "Иван"; Док.forms["frm"].otch.Value = "Иванович"; КонецЕсли; КонецПроцедуры

Записать данные в HTML-документ

Требуется записать список номенклатуры и изображения в форматированный документ .html. Пусть у номенклатуры имеется реквизит Картинка и типом ХранилищеЗначений.

Листинг 1 — Процедура записи текста и картинок в файл формата html

&НаКлиентеПроцедура ЗаписатьТекст(Команда) Путь="d:\temp\"; ФД=СформироватьТекст(); ФД.Записать(Путь+"rezult.htm", ТипФайлаФорматированногоДокумента.HTML);КонецПроцедуры&НаСервереБезКонтекстаФункция СформироватьТекст() ФД=Новый ФорматированныйДокумент; ФД.Добавить(, ТипЭлементаФорматированногоДокумента.ПереводСтроки); ФД.Добавить("Номенклатура:", ТипЭлементаФорматированногоДокумента.Текст); Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Продолжить; КонецЕсли; ФД.Добавить(, ТипЭлементаФорматированногоДокумента.ПереводСтроки); ФД.Добавить(СокрЛП(Выборка.Наименование), ТипЭлементаФорматированногоДокумента.Текст); //Записываем картинку из ХранилищеЗначения: Картинка = Выборка.Картинка.Получить(); Если Картинка <> Неопределено Тогда ФД.Добавить(Картинка, ТипЭлементаФорматированногоДокумента.Картинка); ФД.Добавить(, ТипЭлементаФорматированногоДокумента.ПереводСтроки); КонецЕсли; КонецЦикла; Возврат ФД;КонецФункции

Работа с файлами

ActiveX

Как использовать элементы управления ActiveX?

Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогФыбораФайла = Новый ДиалогВыбораФайла(Режим); ДиалогФыбораФайла.Фильтр = "Все файлы (все)|*.*"; ДиалогФыбораФайла.Заголовок = "Выберите медиа файл"; Если ДиалогФыбораФайла.Выбрать() Тогда ПутьКМедиаФайлу = ДиалогФыбораФайла.ПолноеИмяФайла; // В зависимости от варианта объекта запись полного пути к файлу // производится либо в свойство FileName, либо в свойство URL. Попытка ЭлементыФормы.WMP.FileName = ПутьКМедиаФайлу; Исключение ЭлементыФормы.WMP.URL = ПутьКМедиаФайлу; КонецПопытки; КонецЕсли;

Работа с Интернет

Работа с файлами

Загрузка файлов по FTP

Процедура ЗагрузитьОтмеченные(Кнопка) Сервер = Новый FTPСоединение(FTPServer); Для Каждого Файл Из ПолеСписка Цикл Если Файл.Пометка Тогда Сервер.Получить(Файл.Значение.ПолноеИмя, "с:\temp" + Файл.Значение.ПолноеИмя); Файл.Пометка = Ложь; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура Просмотреть(Кнопка) Сервер = Новый FTPСоединение(FTPServer); МассивФайлов = Сервер.НайтиФайлы("/","*.*"); Для Каждого Файл Из МассивФайлов Цикл Если Файл.ЭтоФайл() Тогда ПолеСписка.Добавить(Файл, Файл.Имя) КонецЕсли; КонецЦикла; КонецПроцедуры

Выполнение HTTP запроса

СерверИсточник = HTTPserver; Адрес = "/price.asp"; ИмяВходящегоФайла = "c:\temp\input.html"; НТТР = Новый HTTPСоединение(СерверИсточник); НТТР.Получить(Адрес, ИмяВходящегоФайла); ВходящийФайл = Новый Файл(ИмяВходящегоФайла);

Как установить HTTP соединение если подключение через прокси (proxy) сервер

// Укажем настройки прокси-сервера ПроксиСервер = Новый ИнтернетПрокси; ПроксиСервер.Пользователь = "Кинев"; ПроксиСервер.Пароль = "12345"; ПроксиСервер.Установить("http", "10.1.1.223", "3100"); СерверИсточник = "www.cennic-etiketka.com"; Адрес = "/price.asp"; ИмяВходящегоФайла = "c:\temp\input.html";// Укажем в HTTP соединении что у нас есть проксик НТТР = Новый HTTPСоединение(СерверИсточник,,,, ПроксиСервер); НТТР.Получить(Адрес, ИмяВходящегоФайла); ВходящийФайл = Новый Файл(ИмяВходящегоФайла);

Работа с COM-объектами

Как из одной базы 1С:Предприятие 8.0 перенести остатки товаров в другую базу, используя COM-соединение.

Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | ОстаткиТоваровОрганизацийОстатки.Организация КАК Организация, | ОстаткиТоваровОрганизацийОстатки.Номенклатура, | ОстаткиТоваровОрганизацийОстатки.ГТДОрганизации, | ОстаткиТоваровОрганизацийОстатки.СтранаПроисхождения, | ОстаткиТоваровОрганизацийОстатки.Комиссионер, | ОстаткиТоваровОрганизацийОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиТоваровОрганизаций.Остатки(&ДатаПереноса, ) | КАК ОстаткиТоваровОрганизацийОстатки |ИТОГИ ПО | Организация"; Запрос.УстановитьПараметр("ДатаПереноса", ДатаПереноса); V8 = Новый COMОбъект("V8.ComConnector"); Попытка Открытие = V8.Connect("File=""" + Путь + """;Usr=""Usr1"";"); Исключение Предупреждение("База данных не открыта!!!"); Возврат; КонецПопытки; Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); МенеджерДокумента = Открытие.Документы.ОприходованиеТоваров; МенеджерНоменклатуры = Открытие.Справочники.Номенклатура; МенеджерОрганизаций = Открытие.Справочники.Организации; // Менеджеры остальных справочников: Пока Выборка.Следующий() Цикл Документ = МенеджерДокумента.СоздатьДокумент(); Код = Выборка.Организация.Код; Организация = МенеджерОрганизаций.НайтиПоКоду(Код); Если Организация.Пустая() Тогда Организация = МенеджерОрганизаций.СоздатьЭлемент(); Организация.Код = Код; // Остальные реквизиты: Организация.Записать(); КонецЕсли; // Обработка остальных реквизитов, справочников: ВыборкаПодчиненная = Выборка.Выбрать(); Пока ВыборкаПодчиненная.Следующий() Цикл // Поиск/перенос данных справочников // заполнение табличной части документа КонецЦикла; Документ.Записать(РежимЗаписиДокумента.Проведение); КонецЦикла;

Пример обращения к программе 1С:Предприятие 8.0 из модуля MS Excel через COM-соединение

Sub load() Dim cntr As Object Dim trade As Object Dim Элемент As Object Dim СправочникКонтрагентов As Object Dim ГруппаКонтрагентов As Object Set cntr = CreateObject("V8.COMConnector") Set trade = cntr.Connect("File=""C:\DemoTrd4"";Usr=""Федоров (администратор)"";") Set СправочникКонтрагентов = trade.Справочники.Контрагенты Set ГруппаКонтрагентов = СправочникКонтрагентов.СоздатьГруппу() ГруппаКонтрагентов.Наименование = "***** Экспорт из Excel ******" ГруппаКонтрагентов.Записать N = 11 'Количество строк в списке поставщиков For Count = 3 To N Set Элемент = СправочникКонтрагентов.СоздатьЭлемент() Элемент.Код = Application.Cells(Count, 1).Value Элемент.Наименование = Application.Cells(Count, 2).Value Элемент.ИНН = Application.Cells(Count, 3).Value Элемент.НаименованиеПолное = Application.Cells(Count, 4).Value Элемент.Родитель = ГруппаКонтрагентов.Ссылка Элемент.Записать Next Count End Sub

WScript.Shell

Данный метод служит для запуска внешних приложений из тела сценариев Windows Script Host. Для начала мы рассмотрим теоретическую часть, а потом приступим к программированию.

Run(strCommand, [intWindowStyle], [bWaitOnReturn]) – данный метод служит для запуска другого приложения как в консольном режиме (командная строка), так и в оконном. При открытии исполняемого файла создается новый процесс. Ему передаются следующие параметры:

strCommand – данный параметр является обязательным, поскольку задает путь для файла или команды. Стоит учитывать, что если путь содержит пробелы, то его обязательно стоит заключать в двойные кавычки, иначе, возникнет ошибка "The system cannot find the file specified" – система не может найти указанный файл. Также полезно, использовать переменные окружения в пути к приложению, это экономит время.

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

    • 0 – скрывает окно, будет виден только процесс в диспетчере задач.

    • 1 – нормальный режим

    • 2 – свернутый вид

    • 3 – развернутый вид

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

Хорошо, теперь настало время заняться программирование. Для начала напишем программный код на языке VBScript:

'******************************************************* ' метод wscript shell run ' Запуск бл0кн0та и калькулятора ' wshshell_run.vbs '******************************************************* Option Explicit dim path, WshShell ' задаем путь к системной папке path = "%WINDIR%\System32\" ' Создаем ссылку на объект WscriptShell set WshShell = WScript.CreateObject("Wscript.Shell") ' Открываем notepad (Wshshell Run) WshShell.Run path & "notepad.exe", ,true MsgBox "Текстовый редактор завершил работу!!!" & vbCrLf & "Запускаем калькулятор" ' Открываем calc WshShell.Run path & "calc.exe",2,false MsgBox "Этот текст выводится сразу"

Давайте проанализируем логику работы данного сценария. Переменная path хранит путь к папке System32, так как в ней у нас лежат исполняемые файлы notepad и calc. Переменная окружения "%WINDIR%" позволяет сократить строки кода и не писать "C:\\Windows". WshShell содержит ссылку на экземпляр объекта Wscript.Shell, видим, чтобы создать саму ссылку, мы перед переменной прописали ключевое слово set, после чего идет вызов метода CreateObject класса WScript, подробней о работе с объектами читайте "Урок 8 по VBScript: Объекты и классы" и "Урок 4 по JScript: Создание собственных объектов". Далее мы запускаем блокнот с помощью метода Run Wscript Shell класса, через переменную WshShell. Для программы notepad мы третий параметр команды Run поставили в true, поэтому, исполняемый файл calc запустится только после закрытия приложения блокнот, плюс, перед этим появится информационное сообщение.

Теперь, рассмотрим использование WScript.Shell на примере программной задержки:

1) Старый древний "индусский" способ - цикл задержки. Недостатки - большая загрузка процессора, разная по времени задержка на компьютерах разной производительности.

2) Осовремененная вариация "индусского" способа. Цикл задержки прерывающийся по прошествии некоторого времени (т.е. с помощью функции ТекущееВремя() вычисляется время выполнения цикла). Недостаток - большая загрузка процессора

3) ОбработкаОжидания. В общем то это способ не приостанавливать периодически код, а - ЗАПУСКАТЬ периодически код. Но можно применять и наших целях. Например - наша обработка может быть вызвана обработкой ожидания, после вызова перепровести 1 документ, пометить его особым образом, и остановится. После получения следующего вызова будет перепроведен следующий документ и т.д. Недостатки способа - громоздкость и исключительная неэлегантность. Также к недостаткам относится необходимость как то "помечать" уже обработанные объекты. А это дополнительная лишняя нагрузка на сервер.

4) Организация программной задержки с использованием сторонних механизмов.

Пример с задержкой 7 секунд

Для 1С 8:

СтрокаЗапроса = "ping -n 1 -w 7000 127.255.255.255";

WshShell = Новый COMОбъект("WScript.Shell");

WshShell.Run(СтрокаЗапроса, 0, -1);

Для 1С 7.7:

СтрокаЗапроса = "ping -n 1 -w 7000 127.255.255.255";

WshShell = СоздатьОбъект("WScript.Shell");

WshShell.Run(СтрокаЗапроса, 0, -1);

Как выполнить запрос к произвольной базе данных SQL?

стрПодключения = "Driver={SQL Server};" стрПодключения = стрПодключения + ИмяСервера + ";"; стрПодключения = стрПодключения +"Uid=" + ИмяПользователя + ";"; стрПодключения = стрПодключения + "Pwd=" + Пароль + ";"; стрПодключения = стрПодключения + "DataBase =" + ИмяБазы + ";"; стрПодключения = стрПодключения + "Pwd=" + Пароль + ";"; Connection = Новый COMОбъект("ADODB.Connection"); Connection.OpenServer = стрПодключения; RS = Новый COMОбъект("ADODB.Recordset"); // Запрос к базе на языке SQL запросов. RS.Open("Select * from TradeUnit", Connection); Пока RS.EOF() = 0 Цикл // Можно обращаться и обрабатывать значения полей выборки. ИД = RS.Fields("ID").Value; Код = RS.Fields("Code").Value; // Обработка других полей RS.MoveNext(); КонецЦикла; RS.Close(); Connection.Close();

Automation Client/Server (OLE)

Как из одной базы 1С:Предприятие 8.0 интерактивно заполнить документ в другой базе, используя Automation Client/Server (OLE)?

V8 = Новый COMОбъект("V8.Application"); Попытка Открытие = V8.Connect("File=""" + Путь + """;Usr=""Usr1"";"); Исключение Предупреждение("База данных не открыта!!!"); Возврат; КонецПопытки; МенеджерДокумента = V8.Документы.РеализацияТоваров; Документ = МенеджерДокумента.СоздатьДокумент(); ФормаДокумента = Документ.ПолучитьФорму(); ФормаДокумента.ОткрытьМодально();

Как из таблицы Excel загрузить список номенклатуры в 1С:Предприятие с возможностью редактирования?

Sub load()

Dim trade As Object Dim СправочникНоменклатуры As Object Dim ГруппаНоменклатуры As Object

Dim Элемент As Object Dim Форма As Object

Set trade = CreateObject("V8.Application") trade.Connect("File=""C:\DemoTrd4"";Usr=""Федоров (администратор)"";")

Set СправочникНоменклатуры = trade.Справочники.Номенклатура

Set ГруппаНоменклатуры = СправочникНоменклатуры.СоздатьГруппу() ГруппаНоменклатуры.Наименование = "***** Экспорт из Excel ******"

ГруппаНоменклатуры.Записать N = 4 'Количество загружаемых элементов справочника

For Count = 2 To 5

Set Элемент = СправочникНоменклатуры.СоздатьЭлемент()

Элемент.Код = Application.Cells(Count, 1).Value

Элемент.Артикул = Application.Cells(Count, 2).Value

Элемент.Наименование = Application.Cells(Count, 3).Value

Элемент.НаименованиеПолное = Application.Cells(Count, 4).Value

Элемент.Родитель = ГруппаНоменклатуры.Ссылка

Set Форма = Элемент.ПолучитьФорму() Форма.ОткрытьМодально

Next Count

End Sub

Обмен данными

Как организовать работу удаленных складов?

Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента) Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.РеализацияТоваров") Тогда Если ЭлементДанных.Склад <> Склад Тогда ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить; КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.РеализацияТоваров") Тогда ПолучениеЭлемента = ПолучениеЭлементаДанных.Принять; КонецЕсли; КонецПроцедуры Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.РеализацияТоваров") Тогда Если ПланыОбмена.ИзменениеЗарегистрировано(Ссылка, ЭлементДанных) Тогда ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; КонецЕсли; КонецЕсли; КонецПроцедуры

Как при создании начального образа управлять тем, какие виды объектов перегружаются, а какие нет?

Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента) Если НеВыгружатьОбъекты Тогда // Проверить "ненужные типы", условие может содержать проверку // на несколько типов. Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.РеализацияТоваров") Тогда ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить; КонецЕсли; КонецЕсли; КонецПроцедуры

Как просмотреть объекты, для которых зарегистрированы изменения?

ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); Узел = ПланыОбмена.НаСклады.НайтиПоКоду("С1"); ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗапСообщения.НачатьЗапись(ЗаписьXML, Узел); Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения); Пока Выборка.Следующий() Цикл Данные = Выборка.Получить(); Сообщить(Данные); КонецЦикла; ЗапСообщения.ПрерватьЗапись(); Стр = ЗаписьXML.Закрыть();

Как организовать обмен данными между произвольными конфигурациями 1С:Предприятие 8.0?

Процедура Выгрузка(Элемент) Путь = "c:\"; //реальный путь к каталогу, в котором создаются файлы ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.ОткрытьФайл(Путь + "выгрузка.xml"); Узел = ПланыОбмена.Поставка.НайтиПоКоду("Маг1"); ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗапСообщения.НачатьЗапись(ЗаписьXML, Узел); Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения); Пока Выборка.Следующий() Цикл Данные = Выборка.Получить(); Если ТипЗнч(Данные) = Тип("ДокументОбъект.РеализацияТоваров") Тогда ВыгрузкаРеализации(ЗаписьXML, Данные); Иначе // все остальные объекты ЗаписатьXML(ЗаписьXML, Данные); КонецЕсли; КонецЦикла; ЗапСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); КонецПроцедуры Процедура ВыгрузкаРеализации(ЗаписьXML, Документ) ЗаписьXML.ЗаписатьНачалоЭлемента("DocumentObject.ПередачаТовара"); ЗаписатьXML(ЗаписьXML, Документ.Ссылка.УникальныйИдентификатор(), "Ref", НазначениеТипаXML.Явное); ЗаписатьXML(ЗаписьXML, Документ.ПометкаУдаления, "DeletionMark",НазначениеТипаXML.Явное); ЗаписатьXML(ЗаписьXML, Документ.ВалютаДокумента, "ВалютаДокумента", НазначениеТипаXML.Явное); // Остальные свойства документа. // Табличная часть. ЗаписьXML.ЗаписатьНачалоЭлемента("Товары"); Для Каждого ТекСтрока Из Документ.Товары Цикл ЗаписьXML.ЗаписатьНачалоЭлемента("Row"); ЗаписатьXML(ЗаписьXML, ТекСтрока.Номенклатура, "Номенклатура", НазначениеТипаXML.Явное); ЗаписатьXML(ЗаписьXML, ТекСтрока.Количество, "Количество", НазначениеТипаXML.Явное); // Остальные реквизиты табличной части. ЗаписьXML.ЗаписатьКонецЭлемента(); КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура Загрузка(Элемент) Путь = "c:\"; //реальный путь к каталогу, в котором создаются файлы ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл(Путь + "выгрузка.xml"); ЧтСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтСообщения.НачатьЧтение(ЧтениеXML); ПланыОбмена.УдалитьРегистрациюИзменений(ЧтСообщения.Отправитель, ЧтСообщения.НомерСообщения); Пока ВозможностьЧтенияДанных(ЧтениеXML) Цикл Данные = ПрочитатьДанные(ЧтениеXML); Если РазрешениеКоллизий(Данные) Тогда Данные.ОбменДанными.Отправитель = ЧтСообщения.Отправитель; Данные.ОбменДанными.Загрузка = Истина; Данные.Записать(); КонецЕсли; КонецЦикла; ЧтСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); КонецПроцедуры Функция ВозможностьЧтенияДанных(ЧтениеXML) ТипXML = ПолучитьXMLТип(ЧтениеXML); Если ТипXML = Неопределено Тогда Возврат Ложь; КонецЕсли; Если ТипXML.ИмяТипа = "DocumentObject.ПередачаТовара" И ТипXML.URIПространстваИмен = "" Тогда Возврат Истина; КонецЕсли; Возврат ВозможностьЧтенияXML(ЧтениеXML); КонецФункции Функция ПрочитатьДанные(ЧтениеXML) ТипXML = ПолучитьXMLТип(ЧтениеXML); Если ТипXML.ИмяТипа = "DocumentObject.ПередачаТовара" И ТипXML.URIПространстваИмен = "" Тогда Возврат ЧтениеРеализации(ЧтениеXML); КонецЕсли; Возврат ПрочитатьXML(ЧтениеXML); КонецФункции Функция ЧтениеРеализации(ЧтениеXML) ЧтениеXML.Прочитать(); // Работа со ссылкой документа. ПолученнаяСсылка = ПрочитатьXML(ЧтениеXML); Док = Документы.ПоступлениеТоваров.ПолучитьСсылку( Новый УникальныйИдентификатор(ПолученнаяСсылка)); Документ = Док.ПолучитьОбъект(); Если Документ = Неопределено Тогда Документ = Документы.ПоступлениеТоваров.СоздатьДокумент(); Документ.УстановитьСсылкуНового(Док); Документ.Дата = ТекущаяДата; Документ.УстановитьНовыйНомер(); КонецЕсли; Документ.ПометкаУдаления = ПрочитатьXML(ЧтениеXML); Документ.ВалютаДокумента = ПрочитатьXML(ЧтениеXML); // Табличная часть "Товары. // Построчное чтение. ЧтениеXML.Прочитать(); Документ.Товары.Очистить(); Пока ЧтениеXML.Имя = "Row" Цикл // Позиционируемся на узле с номенклатурой. ЧтениеXML.Прочитать(); НоваяСтрока = Документ.Товары.Добавить(); НоваяСтрока.Номенклатура = ПрочитатьXML(ЧтениеXML); НоваяСтрока.Количество = ПрочитатьXML(ЧтениеXML); // Читаем конец узла Row. ЧтениеXML.Прочитать(); КонецЦикла; // Читаем конец табличной части. ЧтениеXML.Прочитать(); // Читаем конец документа. ЧтениеXML.Прочитать(); Возврат(Документ); КонецФункции Функция РазрешениеКоллизий(Данные) Если ТипЗнч(Данные) = Тип("ДокументОбъект.ПоступлениеТоваров") Тогда Если Не Данные.ЭтоНовый() Тогда СсылкаНаУзел = ПланыОбмена.Поставка.НайтиПоКоду("Опт"); Если ПланыОбмена.ИзменениеЗарегистрировано(СсылкаНаУзел, Данные) Тогда Возврат(Ложь); КонецЕсли; КонецЕсли; КонецЕсли; Возврат(Истина); КонецФункции

Как принудительно зарегистрировать изменения объектов?

СсылкаНаУзел = ПланыОбмена.НаСклады.НайтиПоКоду("С1"); ПланыОбмена.ЗарегистрироватьИзменения(СсылкаНаУзел, Неопределено); СсылкаНаУзел = ПланыОбмена.НаСклады.НайтиПоКоду("С1"); ПланыОбмена.ЗарегистрироватьИзменения(СсылкаНаУзел, Метаданные.Справочники.Номенклатура); СсылкаНаУзел = ПланыОбмена.НаСклады.НайтиПоКоду("С1"); ДокСсылка = Документы.РеализацияТоваров.НайтиПоНомеру(НомерДок, ДатаПериода); Если Не ДокСсылка.Пустая() Тогда ПланыОбмена.ЗарегистрироватьИзменения(СсылкаНаУзел, ДокСсылка); КонецЕсли;

WEB-расширение

Как в форме списка номенклатуры отменить все установленные отборы?

private void commandPanel_ItemCommand(object source, System.Web.UI.WebControls.CommandEventArgs e) { if (e.CommandName = = "ShowAll") { foreach (V8Filter filter in listDS.Filter) { filter.Checked = false; } grid.Refresh(); } }

Как запретить перенос содержимого ячеек в форме списка расходных накладных?

private void Grid_ItemDataBound(object sender, _1C.V8.WebControls.V8GridItemEventArgs e) { foreach (TableCell cell in e.Item.Cells) cell.Wrap = false; }

Как открыть список расходных накладных с отбором, установленным по определенному складу?

Функция ПолучитьЗначениеПоУмолчанию(Пользователь, Свойство) Экспорт Отбор = Новый Структура; Отбор.Вставить("Пользователь", Пользователь); Отбор.Вставить("Настройка", ПланыВидовХарактеристик.НастройкиПользователей.НайтиПоНаименованию(Свойство)); Результат = РегистрыСведений.НастройкиПользователей.Получить(Отбор); Возврат Результат.Значение; КонецФункции

private void Page_Load(object sender, System.EventArgs e)

{ if (!IsPostBack)

{ Title.Text = ListDataSource.TableInfo.Presentation; // Добавляемый код.

ListDataSource.Connection.Open();

try { ObjectRef currUser = (ObjectRef)V8.Get (ListDataSource.Connection,ListDataSource.Connection.Connection, "глТекущийПользователь");

ObjectRef mainWH = (ObjectRef)V8.Call (ListDataSource.Connection,ListDataSource.Connection.Connection, "ПолучитьЗначениеПоУмолчанию", currUser, "ОсновнойСклад");

if (!mainWH.IsEmpty())

{ V8Filter filter = ListDataSource.Filter["Склад"];

filter.Checked = true;

filter.Condition = V8FilterCondition.Equal;

filter.ValueType1 = ListDataSource.Metadata.TypesInfo[V8.TypeNameFromValue(mainWH)];

filter.Value1 = mainWH; filter.Presentation1 = mainWH.Presentation(ListDataSource.Connection);

}

}

finally

{ ListDataSource.Connection.Close();

}

}

}

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using _1C.V8.WebControls; using _1C.V8.Data;

Как добавить кнопку для ввода документа на основании?

V8Grid_onInputOnBasis( '', 'grid', document.getElementById('grid_SelectedItem').value, 'Документ.ПриходнаяНакладная')

Реестр Windows

Как прочитать значение, хранящееся в реестре Windows?

Перем Значение; // В эту переменную запишем значение из реестра RegProv=ПолучитьCOMОбъект( "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv" );// Читаем значение ключа StartDate из ветки // HKEY_CURRENT_USER\Software\1C\1Cv8\Report в переменную Значение RegProv.GetStringValue("2147483649","Software\1C\1Cv8\Report","StartDate",Значение);

Как сохранить значение в реестр Windows?

// Создадим ключ, установив значение в текущую дату RegProv.CreateKey("2147483649","Software\1C\1Cv8\Report"); // создание раздела// установка значения для ключа RegProv.SetStringValue("2147483649","Software\1C\1Cv8\Report","StartDate", Строка(Формат(ТекущаяДата(),"ДФ=ггггММддЧЧммсс")));

Пример работы с javascript. Функция split() и регулярные выражения.

К сожалению, в 1С нет функции работы со строками split() и нет регулярных выражений. Зато эта функция есть в JavaScript. Она делит строку по строке-разделителю или регулярному выражению и возвращаем массив подстрок. Задействуем мощь JavaScript и регулярных выражений. Пример показывает как можно вызвать функцию JavaScript split() из кода 1С.

// строкаСоединения: "Srvr="serv3";Ref="zup";

Функция ПолучитьЗначения(строкаСоединения)

ScrptCtrl = новый COMОбъект("MSScriptControl.ScriptControl");

ScrptCtrl.Language="JScript"; // альтернатива: "vbscript";

// строка-фрагмент кода на JavaScript

strJsCode="

|function GetValues(str,strKey){

| var arr=str.split(/;/i);

| return arr;

|}";

ScrptCtrl.AddCode(strJsCode);

//выполнить вызов функции на JavaScript из фрагмента

strExecute="GetValues('" + строкаСоединения + "');";

сообщить("strExecute:" + strExecute);

comArr = ScrptCtrl.Eval(strExecute);

для каждого параметр из comArr цикл

Сообщить("параметр:" + параметр);

КонецЦикла;

Возврат comArr;

КонецФункции

Функция ПараметрыСоединения()

// получим строку соединения с базой 1С

СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();

//пример: строкаСоединения: "Srvr="serv3"¶Ref="zup"¶"

//("¶" - это Символ перевода строки (ПС))

// Заменим его на ";"

строкаСоединения=СтрЗаменить(строкаСоединения,Символы.ПС,";");

arr = ПолучитьЗначения(СтрокаСоединения);

Возврат arr;

КонецФункции

ПараметрыСоединения();

Как работать с zip архивами


Процедура Пример_РаботыСZipАрхивами()


// создание архива и добавление файла

НовыйАрхив = Новый ЗаписьZipФайла("X:\Бухгалтерия\РасчетныеЛисты.zip", // Путь СокрЛП(пароль), // пароль на архив (оставим пустой) "Этот архив создан из 1с", // комментарий к архиву МетодСжатияZIP.Сжатие, // сжатие или копирование УровеньСжатияZIP.Оптимальный, МетодШифрованияZIP.Zip20 ); НовыйАрхив.Добавить(ВремФайл); НовыйАрхив.Записать();

// открытие и распаковка архива

Архив = Новый ЧтениеZipФайла("C:\Архив.zip");

Архив.ИзвлечьВсе("C:\РаспакованныйАрхив");


КонецПроцедуры

Как работать с хранилищем значения


Процедура Пример_РаботыСХранилищемЗначения()


// создадим хранилище для хранение картинки в базе

МояКартинка = Новый Картинка("C:\Картинка.bmp");

ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);


// теперь мы можем сохранить это хранилище в одном из полей базы

Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();

Номенклатура.Наименование = "Стул";

Номенклатура.Изображение = ХранилищеКартинки;

Номенклатура.Записать();


// затем, мы можем всегда извлечь его

МояКартинка = ХранилищеКартинки.Получить();


КонецПроцедуры


Как работать с двоичными данными


Процедура Пример_РаботыСДвоичнымиДанными()


Данные = Новый ДвоичныеДанные("c:\Картинка.png");

Сообщить(Данные.Размер());

// можно сохранить их в хранилище значений

Данные.Записать("c:\binary_data");


КонецПроцедуры


Как производить хеширование данных


Процедура Пример_ХешированиеДанных()


Хеш = Новый ХешированиеДанных(ХешФункция.CRC32);


Хеш.ДобавитьФайл("c:\Картинка.png");

Сообщить(Хеш.ХешСумма);


Хеш.ДобавитьФайл("c:\Документ.doc");

Сообщить(Хеш.ХешСумма);


// Хеш.Добавить(ДвоичныеДанные);


КонецПроцедуры