Как можно построить выгрузку-загрузку посредством файлов DBF?
Путь к загружаемому X ML-доку менту указан в переменной «ПутьКФайлу». Используется модель последовательного доступа. В данном примере под загрузкой будет пониматься чтение данных и вывод их в окно служебных сообщений. Загружать будем документ, выгруженный в предыдущем примере.
Чтение = Новый ЧтениеХМЬ;
Чтение.ОткрытьФайл(ПутьКФайлу):
Пока Чтение.ПрочитатьО Цикл // Прочитать «структурные части» элементов
// Проверить, какая часть элемента — текущая.
Если Чтение.ТипУзла = ТипУзлаХМЬ.НачалоЭлемента Тогда 11 мяУтла = Чтение.Имя,
СообщитьС—" + ИмяУзла);
// Атрибуты элементов можно читать только если текущая часть -И начало элемента
Пока Чтение.ПрочитатьАтрибутО Цикл
// Прочитать данные узла атрибута.
ТипУзла = Чтение.ТипУзта;
Имя = Чтение.Имя;
Значение = Чтение.Значение;
// Обработать полученные значения.
КонецЦикла;
ИначеЕслн Чтеннс.ТипУзла = ТипУзлаХМЬ.Текст Тогда
// В примере просто выводим текст в окно сообщений. СообщитьС’Текст:" + Чтение.Значение);
ИначеЕсли Чтение.ТипУзла = ТипУзлаХМЬ.КонецЭлемента Тогда
// В примере просто выводим признак конца элемента
И в окно сообщений
СообщитьС—Конец:" + Чтение.Имя);
КонецЕсли;
КонецЦикла
Объект ЧтениеХМ1_ производит чтение данных, используя модель последовательного доступа. В этой модели обход документа производится именно по его структурным элементам последовательно, за исключением узлов атрибутов, для которых необходимо организовывать вложенный цикл.
Приведем фрагмент данных выводимых в окно служебных сообщений:

DBF-файлы
® Как можно построить выгрузку-загрузку посредством файлов DBF?
Не смотря на то, что формат DBF считается уже устаревшим, может возникнуть необходимость работы с файлами данного формата.
Выгрузка данных:
БД = Новый XBase:
БД.Поля.Добавить("СООЕ", "S", 5);
БД.Поля.Добавить)"NAME", "S", 40);
БД.СотдатьФайлЦІуть + "start.dbf", Путь + "index.cdx");
БД.Индексы.Добавить)"IDXCODE", "CODE");
ФлИБД = БД.СоздатьИндексныйФаГіл(Пугь + "index.cdx"); БД.АвтоСохранение = Истина:
Выборка = Справочники. Номенклатура. ВыбратьИсрархическиО;
Пока Выборка.СледующийО Цикл БД.ДобавитьО;
БД.ССЮЕ = Выборка.Код;
БД^АМЕ = Выборка! Іаимснованис:
КонецЦикла;
БД.ЗакрытьФайл));_
Загрузка данных:
БД = Новый XBase;
БД.ОткрыгьфайліПуть + "start.dbf". Путь + "index.cdx”); БД.ТекущийИндекс = БД.Индексы.ЮХССЮЕ;
Пока БД.СледующаяО Цикл Сообщить) БД.СОПЕ);
Сообщить) БД.ЫАМЕ);
КонецЦикла;
БД.ЗакрытьФайлО;_
Работа с HTML-документами
Ф Заполнение HTML-анкет
Необходимо заполнить анкету, реализованную как HTML-документ и расположенную на веб-сервере. Будем считать, что необходимо внести данные о фамилии, имени, отчестве физического лица.
Фрагмент HTML-кода анкеты выглядит следующим образом:
<form name='frm' aclion="ankeia.asp">
<table>
<trx(d>d>aMM:iiix/tdxtdxinput type=tcxl name='fam'x/tdx/tr> <trxtd>HMX/tdxtdxinput type=text narne='nam'x/tdx/lr> <trxtd>OT4CCTB0</tdxtdxinput type=text name='otch'x/tdx/tr> </lable>
Сама анкета в «незаполненном» состоянии будет иметь следующий вид:

В примере используется функциональность элемента управления ПолеНТМЦЦокумента (его имя в примере «ПолеНТМЬ»), расположенного в форме обработки. Также в форме обработки расположено поле ввода «URL», в котором указывается адрес анкеты.
Для перехода к необходимой интернет-странице в обработчике события При изменении поля ввода «URL» используется строка кода:
Процедура URLDpn Изменении) Элемент) ЭлементыФормы.ПолеНТМЕ. Перейти) URL); КонецПроцедуры_
Для записи данных следующий код (в данном случае) желательно размещать в обработчике события Документ сформирован поля HTML-документа.
Процедура ПолеНТМЦДокументСформирован(Элемент)
// Событие возникает и при открытии формы, когда в реквизите // URL содержится пустая строка.
Если URL о "" Тогда
Док = ЭлсментыФормы.ПолеНТМЕ. Документ:
// При попытке обратиться к несуществующему свойству // произойдет ошибка floK.forms["frm").fam. Value = "Иванов"; floK.formsI"frm"].nam. Value = "Иван";
ДокТоптеРТгт'ТошЬ. Value = "Иванович”;
КонецЕсли:
КонецПроцедуры
В результате, после отображения анкеты в форме, ее поля сразу же будут заполнены указанными значениями:

Работа с файлами
ф Как организовать диалог выбора текстового файла?
В ряде случаев (особенно при решении задач, связанных с обменом информации) возникает необходимость указания пути к файлу, выбора каталога (фактически то же указание пути к каталога).
Указание пути к файлу:
Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытняФайла = Новый ДиалогВыбораФайла(Режим): ДиалогОткрытияФапла.ПолноеИмяФанла ="";
Фильтр = "Тексте*, txt)|*.txt";
ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Ложь; ДиалогОткрытняФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.ВыбратьО Тогда ПутьКФайлу = ДиалогОткрытияФайла.ПолносИмяФайла; КонецЕсли
Выбор каталога:
Режим = РежимДиалогаВыбораФайла.ВыборКаталога; ДиалогОткрытня = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытия. Каталог =
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытня.Заголовок = "Выберите каталог":
Если ДиалогОткрытия.ВыбратЦ) Тогда
ПутьККаталогу = ДиалогОткрытия.Каталог; КонецЕсли
(D Как прочитать информацию о файле?
При помощи ниже приведенного кода можно дать возможность пользователю выбрать любой файл и сообщить его параметры:
ДиалогОткрытняФайла =
Новый ДиалогВыбораФайла(РежнмДиалогаВыбораФайла.Открытие); ДиалогОткрытияФайла.Выбрать():
Файл = Новый ФайлСДиалогОткрыгияФайла.ПолноеИмяФаііла);
Текст = "Файл: " + Файл.Имя:
Текст = Текст + Символы.ПС + "Расширение: " + Файл.Расширение;
Текст = Текст + Символы.ПС + "Полное имя: " + Файл.ПолноеИмя:
Текст = Текст + Символы.ПС + “Путь: " + Файл.Путь;
Текст = Текст + Символы.ПС + "Размер: " + Файл.РазмерО + ” байт";
Текст = Текст + ?(Файл.ПолучитьНевидимость(), Символы.ПС + "Невидимый.", ”"): Текст = Текст
+ ?(Файл.ПолучитьТолькоЧтение(). Символы.ПС + "Только чтение.", ""); Текст' = Текст + Символы.ПС
+ "Последнее изменение: " + Файл.ПолучитьВремяИзменения(); Сообщить(Текст);
Создаем конструктором диалог выбора файла для открытия. Даем возможность пользователю выбрать в нем файл.
Далее конструктором создаем файл, для чего считываем полное имя файла из диалога открытия файла.
Далее на строковую переменную собираем все характеристики и сообщаем их пользователю.
ф Как получить список файлов в указанном каталоге?
Например, требуется получить список xml-файлов, находящихся в указанном каталоге. Это можно выполнить следующим образом:

Методу НаЙТИФаЙЛЫ() передается в качестве параметров путь и маска поиска. В результате получим коллекцию найденных файлов.
Замечание: если файлы находятся на ftp-сервере, необходимо указывать прямые слеши '/', а не обратные '\' в параметре «Путь».
Как переместить файл, выложенный на ftp к себе на локальный компьютер?
Если НайпиФайлы( "C:\Temp\Sklad.xmr') о Неопрсделено Тогда УлалитьФайлмІ "C:\Temp\ Sklad.xml ");
КонецЕсли;
Если НайтиФайлы("0р://111.222.333.4/Sklad.xml") о Неопределено Тогда ПсреместитьФайл("Лр://І11.222.333.4/Sklad.xml", "С:\Тешр\ Sklad.xml"); Сообщить("Файл перемещен.");
Иначе
Сообщить("Действие не выполнено. Файл в источнике не найден."); КонецЕсли:
Сначала убеждаемся, что в папке-получателе такого файла не существует. Если существует - удаляем.
Далее убеждаемся, что нужный файл есть в папке-источнике. Если есть - перемещаем.
Обратите внимание на написание слешей при работе с ftp-сервером.
Как разделить большой файл на несколько файлов определенного размера?
При передаче файлов большого размера может возникнуть необходимость в «разделении» файла на более мелкие «части» (если есть ограничения на размер писем электронной почты или если, например, необходимо передать файл на дискетах). В этом случае можно воспользоваться методами глобального контекста РазделИТьФаЙЛ() и
ОбъединитьФайлы().
Метод РазделитьФаЙл() позволяет разделить указанный файл (в данном случае «MyFile.exe») на несколько файлов указанного размера (в примере - 1 Мб), и поместить их в указанный каталог:
Раздел итьФайл("0:/І/МуРіІе. xml", 1024*1024, "D:/l/l I/");
Метод ОбъединитьФаЙЛЫ() позволяет «собрать» файл из нескольких частей, указывая маску, по которой должны выбираться файлы, и имя результирующего файла:
(>бъединнтьФайлы("[):/1/11/MyFile.xml.*", "D:/l/l 1/MyProg.exe"):
Как поместить файлы в архив?
Для того чтобы создать архив файлов, расположенных в некотором каталоге, можно использовать объект Запись71РФаЙла:
ФайлАрхива = Новый Запнсь^ірФайла("С:\А rch.zip",,,
МетодСжатиягіР.С жатие, ypoBcnbC*aTHaZIP Максимальный); ФайлАрхива.Добавить("С:\1псіриЬ\????\?гооІ\АррІісІ\*.*“,
РежимСохрансиияПутейХІРСохраня гьОтносительныеПуги. РежимОГіработкиПодкаталоіов2ІР.Обрабатывать Рекурсивно) Файл Архива. Запаса гь();
Для извлечения файлов из ZIP-архива, следует использовать объект
Чтение21РФайла:
ФайлАрхива = Новый Ч гсниегіРФаГыа("С:\Аrch.zip");
ФайлАрхива.ИзвлечьВсеС'СЛОреп",
РсжимВоссгановлснияПугейФаіііовгіР. Восстанавливать):
ФайлАрхива.ЗакрытьО;
Как сравнить два текстовых файла?
ДиалогОткрытияФайла =
Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие): ДиалогОткрытияФайла.Фильтр = “Текстовый докумснт(*ДхО|*.Іхі";
// Выбрать первый файл.
ДиалогОткрытияФайла.Заголовок = “Выберите первый файл:"; ДиалогОткрытияФайла.Выбрать));
ИмяФайлаІ = ДиалогОткрытияФайла.ПолноеИмяФайла;
// Выбрать второй файл.
ДиалогОткрытияФайла.Заголовок = "Выберите второй файл;"; ДизлогОткрытияФайла.ВыбратьО;_
ИмяФайла2 = Диалог ()і крытияФапла.ПолноеМмяФайла:
// Сравнить выбранные файлы.
СравнениеФайлов = Новый СравнсниеФайловО; СравнсниеФайлов.ПсрвыйФайл = ИмяФайлаІ; СравнсігиеФайлов.ВторойФайл = ИмяФайла2;
СравнениеФайлов. И гнорироватьПустоеПространство = Истина; СравнениеФайлов. Способе равнения = СпособСравненняФайлов
.ТекстовыйДокумент:
СравнениеФайлов.ПоказатьРазличия();
Для того, что бы пользователь мог выбрать файлы для сравнения -создаем конструктором диалог выбора файла. Устанавливаем соответствующий фильтр (txt-файлы) и режим диалога.
Даем пользователю выбрать первый файл, потом второй.
Далее создаем конструктором объект СравнениеФайлов. Назначаем имена первого и второго файлов (сравниваемых). Указываем значения свойств, что нужно игнорировать при сравнении пустое пространство и что способ сравнения будет Текстовый Документ (значение устанавливается из системного перечисления СпособСравненияФаЙЛОВ). Далее посредством метода
ПоказатьРазличия() демонстрируем различия в тексте файлов:
?*4 Различие между. CADocuments and Seth.. ?структураі 1 txl _ ? X |
N н н |
л |
% 'л л -4 ¦ |
* к |
|
|
1 381 |
|
|
381 |
// |
|
|
|
|
382 |
по |
структуре поле |
382 |
ПО |
структуре noj |
383 |
/ По переданной с |
383 |
/ |
По переданной |
384 |
// |
|
384 |
// |
|
385 |
// |
Параметры: |
385 |
и |
Параметры: |
386 |
|
|
386 |
|
|
387 |
// |
ИмяТабличнойЧ< |
387 |
// |
ИмяТаблкчиоі |
388 |
// |
СтруктураПоле |
388 |
// |
СтруктураПол |
389 |
|
|
389 |
шашяяшт |
390 |
|
|
|
|
|
391 |
|
|
|
|
|
392 |
и |
Возвращаемое з |
390 |
и |
Возвращаемое |
393 |
// |
Результат зап |
391 |
п |
Результат з« |
394 |
и |
|
392 |
// |
|
< |
|
> |
< |
|
> |
|
Замечание: кроме текста можно сравнивать файлы как таблицы или побайтно. Для этого нужно установить лишь соответствующее значение
свойства СпособСравнения.
Как организовать контроль формирования файла внешним приложением?
Реализуем механизм, который позволит отследить факт появления в определенном каталоге файла с необходимым расширением.

Следующую строку можно разместить в обработчике события При открытии, в теле модуля, либо в других процедурах (зависит от специфики реализации механизма в целом).
ПодключіітьОбработчикОжиданияС'ІІроверкаНаличняФаП іа", 10);
ActiveX
(D Как использовать элементы управления ActiveX?
В качестве примера, на котором продемонстрируем возможность использования в диалоге формы элементов управления ActiveX, рассмотрим возможность использования Microsoft Media Player (для прослушивания музыкальных файлов, воспроизведения видео файлов).
Для вставки в диалог формы соответствующего элемента управления необходимо воспользоваться пунктом главного меню
«Форма | Вставить ActiveX..». В открывшемся диалоге выбора отметим нужный нам объект (как показано на рисунке):
Выбор элемента управления |
¦¦¦кз |
|
VfcfeoRendeiQi Oats |
|
Г ОК |
|
VocabCM Class |
|
|
|
WebViewFofcfcrlcon Class |
|
Отмена |
|
WebViewf oWerlcon Class |
|
Справка |
|
WlA Video Preview Oats |
|
|
|
V/ndovs Media Ptayei |
|
|
|
Панель ссылок |
|
|
|
Предстаеле> не списка |
|
|
|
Элемент управления <алеиаарь 10.0 |
V |
|
L------ ---- |
|
Определим имя элемента управления: «WMP». Кроме этого разместим в диалоге кнопку, при нажатии на которую будет вызываться обработчик события, содержащий ниже приведенный текст:
Режим = РежнмДиалогаВыбораФайла.Открытис; ДиалогФыбораФайла = Новый ДиалогВыбораФайла( Режим); ДиалогФыбораФайла.Фильтр = "Все файлы (все)|*.*"; ДиалогФыбораФайла.Заголовок = "Выберите медиа файл”;
Если ДиалогФыбораФайла.ВыбратьО Тогда ПутъКМсдиаФайлу = ДиалогФыбораФайла.ПолноеИмяФайла:
// В зависимости от варианта объекта запись полного пути к файлу // производится либо в свойство FileName, либо в свойство URL.
Попытка
ЭлементыФормы.Х?МР. File Name = ПутьКМедиаФайлу; Исключение
ЭлементыФормы.??МР.ІіЯЬ = ПутьКМедиаФайлу; КонецПопытки;
КонецЕсли;
В указанной процедуре большинство строк кода работают с объектом ДиалогВыбораФаЙЛЭ, позволяющим организовывать удобный диалог выбора файла. Запуск выбранного файла производится с кнопки «Воспроизведение/Play» элемента управления WMP.
Макеты ActiveDocument
Как сформировать новый договор на основании файла Microsoft Word?
Для заключения договоров с контрагентами разработан типовой договор («пустышка»). При его оформлении (для реального контрагента) в определенные места документа вставляются данные о контрагенте. Подобные фрагменты определены следующим образом «<ИмяОбласти>» (на практике можно использовать другие способы).
Фрагмент такого договора приведен на ниже следующем рисунке:
)ДОГОВОР-№-<НомерДоговора ^
Г
г-Москва-------------------• -* -* -¦ ч —
<Назвщи^Комщни^!>,* именуемое- в- цельнейшем- “ЗАКАЗЧИК",* в* лі .* • действующа
1 о* на* основании* У става, • с • одной* ст
Оформленный таким образом документ сохранен в файле, который загружен в качестве макета (при его создании указывается, что тип макета - «Active document»).

Далее в соответствующем обработчике события (например, в обработчике нажатия на кнопку «Создать договор») размещается следующий текст:
Договор = ПолучитьМакетСДоговор"); |
|
// Получить объект из макета.
MSWord = Договор.ПолучигьО; |
|
ІІаименованиеКоитрагента = "ООО Торгуем всем": |
|
Попытка
Документ = MSWord.Applicalion.Documents(l);
Документ.АсТі?аІсО: |
|
// Получить объект, который будем использовать для поиска и замены.
Замена = Доку мент.Conlent. Find; |
// Заменить заранее определенные ключевые конструкциі Замена. Execute! "<НазваниеКомпании>".
Ложь. Истина. Ложь... Истина,. Ложь. НаименованиеКонтрагента); |
на требуемый текст. |
// Далее аналогично для остальных ключевых конструкций. |
// Делаем видимым приложение и активизируем его. MSWord.Application.Visible = Истина;
MSWord.ActivateO; |
|
Исключение |
|
// Если произойдет ошибка выводятся данные об ошибке Сообщить(ОписаниеОшибкиО):
MSWord. Application.Quit():
КонецПопытки; |
и объект закрывается. |
Работа с Интернет
Работа с электронной почтой
Как организовать работу с электронной почтой через установленного почтового клиента?
Поставим задачу: необходимо реализовать возможность отправки и приема электронной почты непосредственно из 1С: Предприятие 8.0.
В данном случае прием и отправка писем проходит через установленного почтового клиента.
Отправка сообщения:
Почта = Новый Почта;
Почта. Подключиться! "login", "password”);
Сообщ = Новый ПочтовоеСообщенне: Сообщ.Текст = "Доброе время суток!!!!"; Сообщ.Тема = "Срочно в номер!!!";
Данные = Новый ДвоичнысДаннмс! "c:\attach.txt”); Сообщ.Вложения .Добавить! Данные."аИасІіЛхі"); Сообщ.Получатели.Добавить("Ыіпе@ lc.ru"); Почта.Послать(Сообщ, Ложь): Почта.Отключиться();
Прием сообщения:
Почта = Новый Почта;
Почта.Подключиться» "login", "password");
Выборка = Почта.Выбрать(Истина, Ложь);
Для Каждог о Сообщение Из Выборка Цикл СообщитьСТема: " + Строка(Сообщение.Тема)); Сообщить!"Текст: " + Строка(Сообщение.Текст));
Для Каждою Вложение Из Сообщение.Вложення Цикл Сообщнть(Строка( Вложение. Наименование)); КонецЦикла;
КонецЦикла;
Как организовать работу с почтой без установленного почтового клиента на компьютере пользователя?
Данный вариант работы не требует установленного почтового клиента, обращение производится непосредственно на сам почтовый сервер.
Отправка сообщения.
Текст процедуры, отвечающий за формирование и отправку сообщения следующий:
// Сформировать почтовый профиль.
// При отправке нет необходимости указывать настройки, связанные с POP сервером. ИПП — Новый ИнтсрнстПочтовыйПрофнль:
Unn.AapecCepuepaSMTP = Константы. АдресСервсраЗМТР.Получиты); НПП.ВрсмяОжидания = Константы. ВрсмяОжидания.Получить));
ИПП.Пароль = Константы.Пароль.ПолучитьО;
ИПП.Пароль.ЗМТР = Константы. Пароль5МТР.Получить();
ИПП.Пользователь = Константы. Пользователь. Получить();
И П П .Пользе ватель5МТР = Константы. Пользоваз enbSMTP. Полу чить();
И ПП.ПортЯМТР = Константы.ПортБМТР. Получить));
// Создать сообщение.
Сообщение = Новый ИнтернетПочтовоеСообщение; Сообщение.Получатели.ДобавитьСЫіпе® le.ru");
Сообшенне.Отправитель.Адрес - "";
Сообщение.Тема = "Срочно в номер!”;
Сообщение.Тексты.ДобавитьСДоброе время суток!");
Вложение = Новый ДвоичныеДанныс)ПутъКФайлуВложения);
Сообщение. Вложения.Добавить) Вложение.’аиасІіДхГ);
// Подключиться и отправить.
Почта = Новый ИшернетПочта:
Почта.Подключиться(Профнль);
Почта.Послать(Сообщение);
Почта.ОтключитьсяО;
Данные, необходимые для установления подключения к почтовому серверу, находятся в константах конфигурации. Если предполагается, что каждый пользователь работает со своим почтовым ящиком, такой подход не подойдет. Подобные данные нужно будет хранить либо в регистре сведений, либо в справочнике «Пользователи» (его аналоге).
После создания почтового профиля производится создание почтового сообщения (в общем случае сообщений можно создать любое количество). После этого производится подключение к почтовому серверу и отправка сформированного сообщения.
Прием сообщений.
Необходимо создать обработку, которая получала бы письма напрямую с почтового сервера и записывала бы данные в документ «Письмо».
В форме обработки определены два реквизита:
• «Позиция» (тип ЧИСЛО) В диалоге формы обработки размещается элемент управления Индикатор, через свойство Данные связанный с данным реквизитом. При загрузке индикатор будет показывать ход процесса записи данных из полученных почтовых сообщений в документы.
• «СостояниеПриема» (тип Строка). В реквизит будет записываться информация о текущем этапе работы обработки. В диалоге размещается элемент управления Надпись, связанный через свойство Данные с данным реквизитом.
Кроме этого у обработки определен реквизит «ЗабиратьССервера», имеющий тип Булево. В диалоге формы размещен флажок, связанный через свойство Данные с данным реквизитом обработки. Предполагается, что письма будут удаляться с почтового сервера только в том случае если значение данного реквизита равно Истина.
В модуле формы размещена процедура со следующим текстом:
// Формирование почтового профиля.
// При получении нет необходимости указывать настройки, связанные с SMTP сервером.
СостояниеПриема = "Подключение к серверу":
ИПП = Новый ИнтернетПочтовыйПрофнль;
ИПП.АдресСервераРОРЗ = Константы. АдресСервераРОРЗ.Получить! >; НПП.ВремяОжидания = Константы. ВремяОжидания. Получить!);
ИПП.Пароль = Константы. Пароль. Получить!);
ИПП.Пользовазель = Константы.Пользователь.ПолучитьО;
ИПП.ПортРОРЗ = Константы.Порт POP3.Получить!);
Соединение = Новый ИнтернетПочта;
Соединение. Подключиться! ИПП):
СостояниеПриема = "Получение выборки писем";
Выборка = Соединение.Выбрать(ЗабиратьССервера):
СостояниеПриема = "Создание документов - писем";
КоличествоВВыборке = Выборка. Количество!);
Индекс = 1; |
|
Для Каждого Письмо Из Выборка Цикл
ТекПозиция = Окр(Индекс*ІОО/КоличествоВВыборке); |
|
Если ТекПозиция о Позиция Тогда
Позиция = ТекПозиция:
КонецЕсли; |
|
Док = Документы.Письмо.СоздатъДокументО;
Док.Тема = Пнсьмо.Тема:
СтрПолучатели = |
|
Для Каждого Адрес Из Письмо.Получагели Цикл СтрПолучатели = СтрПолучатели + Адрес. Адрес + КонецЦикла: |
|
Док.Получатели = СтрПолучатели; |
|
Если ТипЗнч(Письмо.Отправитель) = Тип("Строка") Тоі Отправитель = Письмо. Отравитель; |
да |
Иначе
Отправитель = Письмо.Отправитель.Адрес; КонецЕсли; |
|
Док.Отмравнтель = Отправитель;
Содержание = |
|
Для Каждого ТекстСообщения Из Письмо.Тексты Цикл Содержание = Содержание + ТекстСообщсния.Текст ч КонецЦикла;
Док.Содержание = Содержание;
Индекс = Индекс + 1;
Док.Записать();
КонецЦикла; |
Символы.ПС; |
Соединение.ОтключитьсяО; |
|
Данные, необходимые для установления подключения к почтовому серверу, находятся в константах конфигурации. Если предполагается, что каждый пользователь работает со своим почтовым ящиком, такой подход не подойдет. Подобные данные нужно будет хранить либо в регистре сведений, либо в справочнике «Пользователи» (его аналоге). После создания почтового профиля производится подключение к почтовому серверу. Далее производится выборка сообщений. В цикле каждое
почтовое сообщение из выборки разбирается и одновременно идет запись в созданный в цикле экземпляр документа «Письмо». Если в письме встречается несколько текстов, то в документе они разделяются символом перевода строки.
Работа с файлами Загрузка файлов по FTP
Создадим обработку, которая позволит просматривать файлы в каталоге по указанному FTP-адресу. Имя FTP-сервера будет записываться в реквизит «FTPServer», файлы будут отображаться в поле списка (с отмеченным свойством «Отображать пометку»).
В модуле для кнопок командной панели необходимо определить обработчики событий:


Выполнение HTTP запроса
В ряде случае существует необходимость получения каких-либо данных из Интернета. Необходимые данные могут размещаться на страницах html, или они могут формироваться при обращении к исполняемым (с точки зрения WEB-сервера) файлам. Для получения таких данных можно использовать HTTP запрос.
СерверИсточник = HTTPserver;
Адрес = "/price.asp";
ИмяВходящегоФайла = "c:\temp\input.htrnr';
HTTP = Новый НТТРСоединение(СерверИсточник); НТТР.Получнть(Адрес. ИмяВходящегоФайла);
ВходящийФайл = Новый Файл(ИмяВходящегоФайла):
В переменной «HTTPserver» указывается путь к каталогу ресурса.
Работа с СОМ-объектами
© Как из одной базы 1С:Предприятие 8.0 перенести остатки товаров в другую базу, используя СОМ-соединение.
Требуется перенести остатки товаров из рабочей базы в новую. Принято решение для этой цели использовать СОМ. Для этой цели создана обработка, у которой определен реквизит «ДатаПереноса» (на какую дату необходимо смотреть остатки). Считается, что база, в которую переносятся данные, функционирует в файловом режиме (в противном случае по другому оформляется строка подключения к базе). Путь к базе находится в переменной «Путь». В переносимой базе существует пользователь с именем «Usrl» со сброшенным паролем. Текст соответствующей процедуры:
Запрос = Новый Запрос:
Запрос.Текст= "ВЫБРАТЬ
I ОстаткиТоваровОрі анизацийОстатки.Организация КАК Организация,
I ОстаткиТоваровОргаиизацийОстатки.Номенклатура,
I ОстаткиТоваровОрганнзацийОстатки.ГТДОрганизации,
I ОстаткиТоваровОрганизацнйОстатки.СтранаПроисхождення,
I ОстаткиТоваровОрганизацийОстатки. Комиссионер,
I Остатки'ТоваровОрганизацийОстатки.КоличсствоОстаток |МЗ
I РегистрНакоплсния.ОстаткиТоваровОрганнзаций.Остатки(&ДатаПереноса.) КАК ОстаткиТоваровОрганизацийОстатки
|ИТОГИ ПО I Организация":
Запрос.УсгановнтьПарамсгрГДатаПсреноса", ДатаПереноса);
?8 = Новый СОМОбъект("?8.СотСоппесТог");
Попытка
Открытие = V8.Connec!(”File=""” + Путь +......:Usr=""Usrr'";"):
Исключение
ПредупреждениеС'База данных не открыта!!!");
Возврат;
КонецПопытки;
Выборка = Запрос
ВыполнитьО
Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
МенсджерДоку мента = Открытис.Документы.ОприходованнеТоваров: МенеджерНоменклатуры = Открытие.Справочники.Номенклатура; МенеджерОрганизаций - Открытие.Справочники.Организации;
// Менеджеры остальных справочников:
Пока Выборка.СледуюшийО Цикл Докумен г = МенеджерДокумента.СоздатьДокумен Ц);
Код = Выборка.Организация.Код;
Организация = МенеджерОрганизаций.НайтиГІоКодуІ Код):
Если Организация.ПустаяО Тогда Организация = МенеджерОрганизаций.СоздатьЭлеменЮ; Организация.Код = Код;
// Остальные реквизиты:
Организация. Зап исатЦ);
КонецЕсли;
// Обработка остальных реквизитов, справочников:
ВыборкаПодчиненная = Выборка.ВыбратьО:
Пока ВыборкаІ1одчиненная.Следующий() Цикл II Поиск/перенос данных справочников // заполнение табличной части документа
КонецЦикла;
Документ.Записать(РежимЗаписиДокумснга.Проведение):
КонецЦикла;
Следует отметить, что в реальной ситуации при переходе на другую базу понадобиться переносить данные и из других объектов системы (состояние взаиморасчетов и т.п.).
Пример обращения к программе 1С:Предприятие 8.0 из модуля MS Excel через СОМ-соединение
Например, в файле Excel хранится список контрагентов, который нужно загрузить в 1 С: Предприятие:
LJ Microsoft Excel Post.xls
:°1 Файл Правка Вид Вставка Формат Сервис Данные Окно ^правка
: Anal
R24C2
Полное наименование
ПОСТАВЩИКИ
1427474374
База Инвентарь
База "Поставка комплектующих
ОАО Ъаза поставки комплектующих
33013
1456784324
База "Продукты*
33014
1846786487
0777909089
33018
Командировочные расходы
оп:яй7-м
АОЗТ Лабан
0012909871
'Фирма "LIGHT"
0122909098
33024
ТООЭКИП
і Действия • Автофигуры • \ Ч I I готово
Для решения этой задачи в таблице Excel можно создать макрос (Сервис | Макрос | Макросы...), который будет запускать требуемую информационную базу 1 С:Предприятия в режиме СОМ-соединения и переносить в нее данные:
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 ГруппаКонтрагентов = СправочникКонтрагентов.СоздатьГруппуО ГруппаКонтрагентов.Наименование = ****** Экспорт из Ьхсеі ******* Г руппаКонтрагентов.Записать
N=11 'Количество строк в списке поставщиков
For Count = 3 То 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
Этот пример представлен на языке MS Visual Basic. Сначала выполняется создание и запуск приложения 1С: Предприятие, в справочнике «Контрагенты» создается новая группа ****** Экспорт из Excel ******»? в которую будут помещаться создаваемые элементы. Далее, в цикле обхода таблицы Excel для каждой строки создается новый элемент справочника «Контрагенты», заполняются его свойства и элемент справочника записывается.
ф Как организовать считывание данных из файлов *.xls?
Рассмотрим простой фрагмент кода позволяющий работать с книгой, состоящей из количества страниц, определенных в переменной «КоличествоСтраниц». Данные в странице расположены следующим образом:
ООО «Торгуем всем» |
|
|
|
Ботинки муж. |
10 |
|
Ботинки жен. |
200 |
На каждой странице в первой строке, первой колонке расположено наименование контрагента. Со второй строки идет «табличная часть»: во второй колонке наименование товара, в третьей колонке его цена.
Док = ПолучитьСОМОбъект(Путь + "ценыконкурентов.хЦ"); КоличествоСтраниц = 2;
Для ТекНомер = 1 По КоличествоСтраниц Цикл Контрагент = Док.81іееі5(ТекНомер).Се1І5(1,1).?а1ие;
Товар = Док. Sheets(TeKHoMep).Cells(2,2). Value;
Цена = Док.8ЬееІ5(ТекНомер).Се1Ь(2,3). Value;
счСтроки = 3;
Сообщить(Строка(Товар) + "-* + СтрокаЩеиа));
Пока СокрЛП(Товар) о"" Цикл // можно использовать другой признак
// окончания данных на листе Товар = Док.8Ьееи(ТекНомер).Се1І5(СчСтроки,2). Value;
Цена = Док.Sheets! ТекНомер).СеІЬІСчСтроки.З). Value;
Сообщить(Строка(Товар) + + Строка(Цена));
счСтроки = счСтроки + 1;
КонецЦикла;
КонецЦикла;
floK.Application.QuitQ;_
Выполнение последней строки обязательно для корректной работы с любыми приложениями Microsoft Office.
Как запустить макрос, записанный в книге Microsoft Excel?
В ряде случаев может потребоваться (после выгрузки данных в существовавшую книгу Microsoft Excel) запустить определенный в этой книге макрос.
Следующий текст иллюстрирует такую возможность
Попытка
// Создать объект.
Excel = Новый СОМОбъект("Ехсе1. Application");
Исключение
Сообщить("Не удалось инициализировать Excel”);
Возврат;
КонецПопытки;
Попытка
//В реальном примере путь может быть совершенно другим.
Excel. Workbooks.Open("c:\doc.xls”);
// Запустить макрос с именем «Оформление».
Excel.ВшіГ'Оформление");
Excel.Visible = Истина;
Исключение
// Если произойдет ошибка выводятся данные об ошибке и объект закрывается Сообщить(ОписаниеОшибкиО);
Excel.QuitO;
КонецПопытки;
Как создать документ программы Microsoft Excel по оформлению, приведенному в другом документе?
Необходимо создать книгу Microsoft Excel с оформлением, пример которого приведен в заранее подготовленной книге. Пример оформления приведен на рисунке.
На листе книги определена именованная область «Шапка», предполагается, что в ней будут находиться данные о контрагенте документа, и в ней же определена шапка табличной части.

Кроме этого определена именованная область «Строка». В ней будут находиться данные о строках табличной части документа. В колонке «Сумма» определена формула (умножение цены на количество)

Оформленный таким образом документ сохранен в виде файла.
В процедуре, которая будет производить выгрузку данных, размещены следующие строки кода:
Попытка
// Создать объект.
Excel = Новый СОМОбъект("Ехсе1.Арр1ісаиоп"); Исключение
Сообщить("Не удалось инициализировать Excel"); Возврат;
КонецПопытки;
Попытка
// Если при отработке следующего фрагмента кода произойдет ошибка // объект "Excel.Application'' будет закрыт

// Открыть книгу, содержащую шаблон оформления. Excel.Workbooks.Open("c:\doc.xls”);
НомерКниги = Excel.Workbooks.Coum;
Книга = Excel. Work books.Itemf НомерКниги);
Лист = Excel.ActiveSheet;
// Создать новую книгу (в нее будем записывать данные . Exccl.Application.Workbooks.Add(l);
НомерКниги = Excel.Workbooks.Count;
КнигаНовая = Excel. Work books. Иет(НомерКннги);
ЛистНовый = Excel.ActiveSheet;
// Установить ширину колонки в новой книге. ЛистНовый.Со1итп$("В").Со1игт^ібі1і = 40;
// Копировать область из книги-шаблона в новую книгу. Лист.Кап§е("Шапка").Сору(ЛистНовый.Каі^еСА1:ЕЗ')і;
ЛистНовый.Cells! 1, l).Value = "Наименование контрагента";
// Считаем, что в нашем случае необходимо сформировать только // две строки табличной части Для НомерСтроки = 1 По 2 Цикл Лист
.Range("CTpoKa")
.Сору(ЛистНовый.Яа^е(ЛистНовый.Се1І8(3 + НомерСтроки, 1),
ЛистНовый.Cells(3 + НомерСтроки, 5)));
// Записать значение в ячейку листа новой таблицы
// в реальном примере данные будут браться из информационной базы
ЛистНовый.Се1І5(3 + НомерСтроки, D.Value = НомерСтроки;
ЛистНовый.Cells(3 + НомерСтроки. 2).Value =
"Наименование номенклатурной позиции ” + Строка(НомерСтроки);
ЛистНовый.Cells(3 + НомерСтроки, 3).Value = НомерСтроки;
ЛистНовый.Се1І8(3 + НомерСтроки, 4).Value = НомерСтроки;
ЛистНовый.Се11а(3 + НомерСтроки, 5).Value = НомерСтроки;
КонецЦикла;
Excel.Visible = Истина;
Исключение
Сообщить(ОписаниеОшибкиО);
Excel.QuitO;
КонецПопытки;
Созданная таким образом книга, после наполнения ее данными делается видимой для пользователя (после чего она может быть им сохранена).
Ф Как выгрузить прайс-лист в документ программы Microsoft Word?
Необходимо реализовать возможность выгрузки данных о стоимости номенклатурных позиций в документ программы «Microsoft Word». При этом желательно использовать хотя бы простейшие возможности по форматированию текста в документе.
Для этой цели создадим обработку в обработчике нажатия на кнопку «Выполнить» которой разместим следующий текст:
Попытка
MSWord = Новый СОМОбъектСWord.Application”);
Исключение
СообщитьГНе удалось инициализировать Microsoft Word'
1);
Возврат;
КонецПопытки;
Запрос = Новый Запрос;
// Получить данные для формируемого прайс-листа.
Запрос.Текст = "ВЫБРАТЬ
I ЦеныКомпаиииСрезПоследних.ЕдиницаИзмерения.Наименование I КАК ЕдиницаИзмерения,
I ЦеныКомпанииСрезПоследних.Цена,
I ЦеныКомпанииСрезПоследних.Номенклатура.Наименование КАК Номенклатура.
I 1 КАК Количество
ІИЗ
I РегистрСведеннй.ЦеныКомпании.СрезПоследних(&Дата. ТипЦен = &ТипЦен)
I КАК ЦеныКомпанииСрезПоследних
I
ІУПОРЯДОЧИТЬ по I Номенклатура I
ІИТОГИ Количество(Количество) ПО I ОБЩИЕ";
Запрос.УстановитьПараметрОДата", ТекущаяДатаО); Запрос.УстановитьПараметрСТипЦен", ТипЦен);
Результат = Запрос. ВыполнитьО;
Попытка
// Создать новый документ MSWord.Documents.AddO;
Документ = MSWord.ActiveDocumentO;
// Добавить новый параграф в созданный документ.
Дoкyмeнт.Paragraphs.AddO;
НомерПараграфа = Документ.Рап^гарЬь.СоипК);
Параграф = Дoкyмeнт.ParagraphsЛtem(HoмepПapaгpaфa);
// В созданный параграф вставить новый «диапазон»
// и разместить в нем текст «Прайс-Лист». Пapaгpaф.Range.InsertAfter("Пpaйc-Лиcт'');
// Установить стиль параграфа «Заголовок 1» (он должен быть определен).
Пapaгpaф.Range.Style="Зaroлoвoк 1";
Документ.Paragraphs. Add();
НомерПараграфа = Дoкyмeнт.Paragraphs.Count();
Параграф = Дoкyмeнт.Paragraphs.Item(HoмepПapaгpaфa). Пaparpaф.Range.InsertAfteг("Cфopмиpoвaн на дату:" + Сгрока(ТекущаяДатаО)); napai^^.Rangc.Style = "Обычный”;
ВыборкаКоличества = Результат
.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаКоличества.Следующий();
КоличествоСтрок = ВыборкаКоличества.Количество;
Документ.Рапч>тар1к.Абб<);
НомерПараграфа = floKyMenT.Paragraphs.Count(); Пapaгpaф=Дoкyмeнт.ParagraphsЛtem(HoмepПapaгpaфa);
// Вставить таблицу с количеством строк равным количеству записей // в выборке результата запроса и с тремя колонками Дoкyмeнт.TaЫes.Add(Пapaгpaф.Raлge. КоличествоСтрок, 3);
// Получить таблицу как объект в отдельную переменную // учитывая тот факт, что таблица у нас единственная Таблица = Документ.ТаЫея.ВепЦЛ);
// Записать данные в ячейку таблицы строка №1, колонка №1 Таблица.СеІІП.І).Ranged. InsertAfterf Номенклатура");
II Установить цвет фона в ячейке
Ta6aHua.Cell(l,l).Shadmg BackgroundPattemColor = 16776960; Ta6,3Hua.Cell(l,2).Range()InsenAfter(”HeHa");
Таблица.CelKl,2). Shading. BackgroundPattemColor = 16776960;
Таблица.Cell( 1,3).Range().lnsertAfter("E;t.H3M.");
Таблица.СеІІП ,3).Shading.BackgroundPattemColor = 16776960;_
НомерСтрокн = I:
Выборка = ВыборкаКоличества.ВыбратьО:
Пока Выборка.Следующий() Цикл НомерСтрокн = НомерСтрокн + 1;
Ta6HHua.Ccll(HoMepCTpoKH.I).Range().lnserlAfter( Выборка. Номенклатура): Таблііца.СеІІ(НомерСтроки,2).Кап8е().Іп.чеііАІ'іег(Строка(Выборка.Цена));
Табл ина.Се1І( НомерСтрокн.3). Rangel іЛпвегТАЛеКВыборкаЕдиницаИзмерения) КонецЦикла;
MSWord.Visible = Истина:
MSWord. Activate!):
Исключение
// Если произойдет ошибка выводятся данные об ошибке и объект закрывается. Сообщить(ОпнсаниеОшибкиО):
MSWord.Application.QuitO;
КонецПопытки;
В первой конструкции «Попытка - Исключение» создаем объект, с помощью которого будем пытаться создавать новый документ. Вторая конструкция «Попытка - Исключение» описана на случай, что если при работе с документом произойдет ошибка, в этом случае созданный объект «Word.Application» будет закрыт. В противном случае созданный документ будет открыт в новом окне программы Microsoft Word.
® Как выполнить запрос к произвольной базе данных SQL?
Данный пример иллюстрирует возможность получения данных из базы данных SQL данных, используя механизм «ADODB».
стрПодключения = «Driver=(SQL Server):» стрПодключения = стрПодключения + ИмяСервера + «;»: стрПодключения = стрПодключения +«Uid=» + ИмяПольювателя + «;» стрПодключения = стрПодключения + «Pwd=» + Пароль + •<;»; стрПодключения = стрПодключения + «DataBase =» + ИмяБазы + «;»; стрПодключения = стрПодключения + «Pwd=» + Пароль + «;»:
Connection = Новый СОМОбъек-Tt''ADODB.Connection"); Connection.OpenServer = стрПодключения;
RS = Новый СОМОбъектСАООІЖRecordset");
// Запрос к базе на языке SQL запросов.
RS.OpenC'Select * from TradeUnit”. Connection);
Пока RS.EOFQ = 0 Цикл
// Можно обращаться и обрабатывать значения полей выборки.
ИД = RS.Ficlds("ID"). Value;
Код = RS.Fields("Code"). Value;
// Обработка других полей
RS.MovcNcxtO:
КонсцЦикла;
RS.CloseO: Connection.Closet)
В начале процедуры создается строка подключения, в которой указывается имя сервера, имя базы, пользователя и пароль. Для подключения к базе используется объект «Connection». Запрос и получение данных производится через объект «RS». По окончании оба объекта закрываются.
Automation Client/Server (OLE)
(D Как из одной базы 1С:Предприятие 8.0 интерактивно заполнить документ в другой базе, используя Automation Client/Server (OLE)?
Необходимо реализовать механизм, позволяющий пользователям одной базы данных заполнять документы другой базы данных.
?8 = Новый СОМОбъект("?8.Application");
Попытка
Открытие = V8.Connect(''File='""' + Путь + "'”';Usr=’"'Usrl Исключение
ПредупреждениеСБача .данных не открыта!!!");
Возврат:
КонецПопытки;
МенеджерДокумента = ?8.Документы.РеалидацияТоваров: Документ = МенеджерДокумента.СоздатьДокументО: ФормаДокумента = Документ.ПолучитьФормуО;
ФормаДокумента.ОткрытьМодальноО;
В переменной «Путь» записан полный путь к открываемой по OLE базе данных. Открываемая база функционирует в файловом режиме. В ней определен пользователь «Usrl», у которого нет пароля на вход.
В приведенном примере форма документа открывается модально, это останавливает процесс выполнения модуля до тех пор, пока пользователь не закончит работу с данной формой. Если необходимо открывать формы объектов не в модальном режиме (по OLE) необходимо позаботиться о времени жизни соответствующих переменных.
Как из таблицы Excel загрузить список номенклатуры в 1 С:Предприятие с возможностью редактирования?
Например, в файле Excel хранится список номенклатуры, который нужно загрузить в 1С: Предприятие, причем, поскольку в 1С:Предприятии уже имеются некоторые номенклатурные позиции, а в таблице Excel указаны не все реквизиты номенклатуры, существующие в справочнике номенклатуры 1 С: Предприятия, требуется дополнительное ручное редактирование каждого вновь создаваемого элемента номенклатуры:

Для решения этой задачи в таблице Excel можно создать макрос (Сервис | Макрос | Макросы...), который будет запускать требуемую информационную базу 1С:Предприятия, используя технологию Automation, переносить в нее данные и открывать формы созданных элементов справочника номенклатуры для редактирования вручную:
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=""OeitopoB (администратор)'"';”)
Set СправочникНоменклатуры = ІтІе.Справочники.Номенклатура Set ГруппаНоменклатуры = СправочникІІоменклатуры.СоздатьГруппуО ГрушіаНоменклатуры.Наименование = "****» Экспорт ит Excel *»****" ГруппаНоменклатуры. Записать
N = 4 Количество загружаемых элементов справочника For Count = 2 То 5
Set Элемент = СправочникНоменклатуры.СоздатьЭлементО Элемент.Код = Application.Cells(Count, 1). Value Элемент.Артикул = Application.Cells(Count, 2).Value Элемент.Нанменование = Application.Cel!s(Count, 3).Value Элемент.НаименованисПолное = Application. CellstCount. 4).Value Элемент.Родитель = ГруппаНоменклатуры.Ссылка Set Форма = Элемент.ПолучитьФормуО Форма.ОікрытьМодально Next Count
End Sub
Этот пример представлен на языке MS Visual Basic. Сначала выполняется создание и запуск приложения 1С:Предприятие, в справочнике «Номенклатура» создается новая группа ****** Экспорт из Excel ******», в которую будут помещаться создаваемые элементы. Далее, в цикле обхода таблицы Excel для каждой строки создается новый элемент справочника «Номенклатура», заполняются его свойства, и форма элемента открывается модально для того, чтобы пользователь мог внести дополнительные изменения, записать новый элемент справочника или отказаться от сохранения этого элемента.
Обмен данными
ф Как организовать работу удаленных складов?
В компании существует несколько территориально удаленных складов. Необходимо организовать работу всех подразделений компании в распределенной базе данных.
При определении состава обмениваемых данных было принято решение о том, что на каждый склад необходимо выгружать только документы «Реализация товаров» (и все «сопутствующие» объекты). На каждый из складов необходимо выгружать только «свои» документы.
При возникновении коллизий (одновременное изменение документа и на складе и в центральном офисе), принимаются изменения, произведенные в складской базе.
Для реализации данного механизма используем возможность создания распределенных информационных баз. Для создания распределенной И Б можно воспользоваться объектом конфигурации ПланОбмена.
Создадим план обмена «НаСклады». Определим у него реквизит «Склад» (тип СправочникСсылка.СкладыКомпании). С помощью
данного реквизита будем «отмечать» принадлежность узла плана обмена к складу компании.
На закладке «Прочие» плана обмена, нажав на кнопку «Состав», включим регистрацию изменений для документа «Реализация товаров». Далее, используя контекстное меню, подберем все связанные объекты. Остается включить флаг «Распределенная база данных», расположенный на закладке «Основные» плана обмена.
План обмена НаСклады Состав
Действия -
Авторегистрация
Л
-С ~ РаслределениеЗаказаПожупателя -Q Г РаспределеииеЗакаэаЛоставшику -f~] Г Реслрвделем«еОжидвемогов>еодяш ~Г~1 Г РаслределемиеОжидаемогоИсходя 471 ? Расхск?еяйКассоеыйОрдер ~ РасходняйОрдерНаТ оеары -W\ ~ ЦЦЦНЯННРИІ— -
“С “ Регистрации»! 4 Рюреимть авторегистрацио "Гл * РеестрСчетов ^ Запретить авторегистрацмо
-ПС СіижаТомоо. Поаойигьсжит***
Подобрать свяэагмые для всех
Теперь нужно определить ряд обработчиков событий в модуле плана обмена.
Процедура ПриОтправкеДанныхПодчиненномуОлементДанных,
ОтправкаЭлемента)
Если ТипЗнч(ЭлсментДанных) =
ТипС'ДокументОбъект.РеалиіацияТоваров") Тогда
Если ЭлементДанных.Склад о Склад Тогда ОтправкаЭлемента = ОтправкаЭлементаДанных. Удалить:
КонецЕсли;
КонецЕсли;
КонеаПроцедуры_
Событие При отправке данных подчиненному вызывается при отправке объекта данных (включении его в файл обмена) подчиненной базе. Если отправляемый объект является документом «Реализация товаров» проверяется совпадение реквизита документа «Склад» и одноименного реквизита плана обмена (документ предназначен именно для данного удаленного склада, представленного текущим планом обмена). Если значения реквизитов не совпадают, отправка документа не производится.
Следующие обработчики событий предназначены для переопределения стандартного механизма разрешения коллизий. Необходимо реализовать механизм, когда при одновременном изменении на складе и в центральном офисе принимаются изменения, произведенные в складской информационной базе.
I Іроцедура I ІриІ ІолученииДаішыхОі Подчиненного! Элемент Данных,
Получен неЭлемента, ОтправкаНазад)
Если ТипЗнчіЭлемеиіДанных) =
ТипГДокументОбъект.Реа. іизацияТоваров") Тогда ПолучениеЭлемента = ПолучениеЭлементаДанных. Принять;
КонецЕсли;
КонецПроисдуры_
Данный обработчик гарантирует, что если из подчиненной базы (складской) приходит измененный документ «Реализация товаров», то эти изменения безоговорочно принимаются.
Процедура ПрнПолученниДанныхОтГлавногоОлементДанных,
ПолучениеЭлемента,
ОтправкаНазад)
Если ТипЗнч(ЭлементДанных) =
Тип("ДокументОбъект.РеалнзацияТоваров") Тогда
Если ПланыОбмена
.ИзмсненнеЗарсгнстрированоГ Ссылка. ЭлементДанных) Тогда ПолучениеЭлемента - ПолучениеЭлементаДанных.Игнорировать;
КонецЕсли
КонецЕсли;
КонсцПроцедуры
В вышеописанном обработчике события (он выполняется при приеме данных в подчиненной базе) перед приемом измененного документа «Реализация товаров» делается проверка на наличие зарегистрированного изменения в текущей базе. Если принимаемый документ также изменялся в текущей (складской) базе, то принимаемые изменения игнорируются. При обратной отправке в файл обмена будет включены изменения, зарегистрированные именно в складской базе.
Остается в пользовательском режиме определить состав баз (складов), в которые будут выгружаться данные.
Предопределенный узел соответствует «текущей» базе, добавляя узлы (с указанием склада) определяем состав распределенной базы данных.
Следует отметить, что распределенная база не обязательно может иметь два уровня иерархии, их может быть намного больше. Но каждая из информационных баз, входящих в распределенную информационную базу, «знает» только свою главную базу и свои «подчиненные». Т.е. при большом количестве уровней в распределенной базе данных нет базы, в которой видна вся ее топология.
После определения узлов можно используя контекстное меню создать начальный образ подчиненной базы и производить с ней обмен данными.

Как при создании начального образа управлять тем, какие виды объектов перегружаются, а какие нет?
В ряде случаев при использовании распределенной информационной базы, возникает необходимость создания начального образа подчиненной базы, но при этом нужно, чтобы в этот образ выгружались данные не по всем видам объектов, определенных в плане обмена. Для реализации подобной возможности можно предусмотреть следующий механизм:
Определите у плана обмена реквизит «Не выгружать объекты» (тип Булево) и разместите его в форме узла.
Поместите в модуль плана обмена следующий обработчик события: |
Процедура ПриОтиравкеДанныхПодчиненномуОлементДанных, |
ОтправкаЭлсмента) |
Если НсВыі ружатьОбъсклы Тогда |
|
// Проверить «ненужные типы», условие может содержат! // на несколько типов .
Если ТипЗнч(ЭлементДанных) = |
проверку |
Т ип(«ДокументОбъект.Реа. |
шдацияТоваров») Тогда |
ОтцравкаЭлемента - ОтправкаЭлечентаДанных.Удалт КонецЕсли:
КонецЕсли;
КомецПроцедуры |
ь; |
|
Перед формированием начального образа для узла необходимо в его форме отметить флаг «Не выгружать объекты» и записать данный объект.
При формировании начального образа для каждого объекта, выгружаемого в периферийную базу, будет отрабатываться обработчик события При отправке данных подчиненному. При установленном флаге «Не выгружать объекты» все элементы данных указанных типов удаляются из отправки.
Как просмотреть объекты, для которых зарегистрированы изменения?
Необходимо просмотреть перечень объектов помеченных в нужном плане обмена как измененные. Сделать это можно, используя следующий фрагмент кода:
3annu.XML = Новый ЗаписьХМЦ);
ЗаписьХМЬ.УстановитьСтроку));
Узел = ПланыОбмсна.НаСклады.НайтиПоКодуС'СГ);
ЗапСообшения = ПланыОбмена.СоздатьЗаписьСообшения)); ЗапСообшения. НачатьЗапнсь) ЗаписьХМЦ Узел):
Выборка = ПланыОбмена
ВыбратьИзменения(Узел, ЗапСообшения.НомерСообщения),
Пока Выборка.СледующийО Цикл Данные = Выборка.Получить));
Сообщить) Данные»;
КонецЦикла;
ЗапСообщен и я. П рерватьЗап не ь();
Стр = ЗапнсьХМІ..Закрыть));_
Так как одним из параметров метода НачатьЗапись() является значение типа ЗаписьХМЦ соответствующий объект приходится создавать. Для того, чтобы не «связываться» с файлом используем метод УстановитъСтроку(). Этим определяем, что результирующий XML-документ будет выводиться в строку при выполнении метода Закрыть().
В процедуре выполняем всю («почти») последовательность по записи сообщения, с той лишь разницей, что обход завершается вызовом метода ПрерватьЗапись() (в этом случае считается, что сообщение не сформировано).
Этот момент важен, поскольку если вместо метода ПрерватьЗапись() будет выполнен метод ЗакончитьЗапись(),
инфраструктура сообщений выполнит регистрацию очередного номера сообщения в базе данных и сформированное таким образом сообщение необходимо будет передавать узлу-получателю.
Как организовать обмен данными между произвольными конфигурациями 1С:Предприятие 8.0?
Требуется организовать возможность регулярной выгрузки документа «Реализация товаров» с загрузкой в базе-приемнике документа «Поступление товаров».
Для простоты будем считать, что структура «связанных» справочников и других объектов полностью совпадает. В базах данных участников обмена используются «единые» справочники.
Базу, из которой производится выгрузка «Реализации товаров», назовем «Оптовик». Базу, в которую производится загрузка «Поступления товаров», назовем «Розничная точка».
При одновременном изменении выгруженного ранее документа Реализация товаров (возникновении коллизии), в обоих базах должны приниматься изменения, произведенные в базе розничной точки. При возникновении коллизий по другим видам объектов принимаются изменения сделанные в оптовой базе данных.
В обеих конфигурациях создадим по плану обмена «Поставка». В оптовой базе у созданного плана обмена отметим регистрацию для документа «Реализация товаров» и подберем все связанные объекты. В розничной базе определим регистрацию изменений для документа «Поступление товаров» и также подберем все связанные.
В плане обмена оптовой базы у предопределенного узла запишем код «Опт», и создадим узел с кодом «Marl». В розничной базе определим все наоборот.
Для выгрузки данных из оптовой конфигурации можно создать обработку. В модуле основной формы необходимо разместить следующий программный код:
Процедура Выгрузка(Элемент)
Путь = "с:\"; //реальный путь к каталогу, в котором создаются файлы
ЗаписьХМЬ = Новый ЗаписьХМЦ);
ЗаписьХМІ..ОткрытьФайл(Пугь + "выгрузка.хтГ);
Узел = ПланыОбмена. Поставка. НайтиПоКоду("МагГ’);
ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщенияО;
ЗапСообщения.НачатьЗапись(ЗаписьХМЕ, Узел);
Выборка = ПланыОбмена
.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения);
Пока Выборка.СледующнйО Цикл Данные = Выборка.Получить():
Если ТииЗнч(Данные) = ТипС'ДокументОбъект.РеализацияТоваров”) Тогда В ы грузкаРеал изаци и(ЗаписьХМ L. Данные);
Иначе // все остальные объекты ЗаписатьХМЦЗаписьХМЬ, Данные);
КонецЕсли;
КонецЦикла:
ЗапСообщения.ЗакончитьЗаписьО;
ЗаписьХМЕ.Закрыть));
КонсцПроцслуры_
Выгрузка осуществляется в узел с кодом «Marl» (правильнее говорить, что будем выгружать данные, отмеченные как измененные для данного узла). Далее по тексту процедуры: получаем выборку объектов, обходим ее. При обходе проверяем тип значения (считается, что все объекты, которые могут попасть в выгрузку, имеют одинаковую структуру) и если объект это документ «Реализация товаров», то для его выгрузки вызывается процедура «Выгрузка реализации». В противном случае используется метод ЗаписатьХМ1_() (метод платформы, позволяющий выгружать «сложные» с точки зрения сериализации значения в X ML-документ). Для выгрузки документа понадобилась отдельная процедура ввиду того, что загрузка будет вестись в документ «Поступление товаров».
Процедура ВыгрузкаРеализацнн(ЗаписьХМЬ. Документ)
ЗаписьХМІ^.ЗаписатьНачалоЭлсмснта("ОоситепЮЬ)ес(.ГІсредачаТовара");
ЗаписатьХМЦЗапнсьХМЬ, Документ.Ссылка.УникалыіыйИдентифнкаторО, "Ref”, НазначениеТнпаХМЬ. Явное); ЗаписатьХМІДЗаписьХМЬ, Документ.ПометкаУ деления,
"DcletionMark". НазначениеТunaXML.Явное); ЗаписатьХМЦЗаписьХМЦ Документ.ВалютаДокумента,
"ВалютаДокумента", IІазначениеТипаХМІ .Явное);
// Остальные свойства документа.
// Табличная часть.
ЗаписьХМІ-.ЗаписатьНачалоЭлемента( "Товары");
Для Каждого ТекСтрока Из Документ.Товары Цикл За[іисьХМЬ.За[іисатьНачалоЭлемента("Ко\?'');
ЗаписатьХМЦЗаписьХМЬ. ТекСтрока.Номенклатура,
"Номенклатура". НазначениеТниаХМЬ.Явнос); 3anHcaTbXML(3anHCbXML. ТекСтрока.Количество.
"Количество", НазначениеТипаХМЬ.Явное);
// Остальные реквизиты табличной части.
ЗапнсьХМЬ.ЗаписатьКонецЭлементаО;
КонецЦикла;
ЗаписьХМЦ.ЗаписатьКонецЭлементаО;
ЗаписьХМЬ.ЗаписатьКонецЭлементаО;
КонецПроцедуры
Процедура «ВыгрузкаРеализации» выгружает документ «Реализация товаров» по определенному в ней алгоритму. Следует отметить, что для упрощения примера выгружаются не все реквизиты, табличные части, реквизиты табличных частей, а только часть из них.
Особенностью данной процедуры является выгрузка ссылки. Она выгружается не как «ДокументСсылка.РеализацияТоваров», а как «Уникальный идентификатор». Это даст нам возможность при загрузке определить «такую же» ссылку у документа «Поступление товаров».
Следующие процедуры содержаться в модуле формы обработки по загрузке данных в розничную конфигурацию.
Процедура Загрузка(Элемент)
Путь = "с:\": //реальный путь к каталогу, в котором создаются файлы
ЧтениеХМЬ = Новый ЧтениеХМЦ):
ЧтениеХМЬ.ОткрытьФайл(Путь + "выгрузка.хті");
ЧтСообщения = ПланыОбмена.СоздатьЧтеннеСообщения();
ЧтСообщения. НачатьЧтение(ЧтениеХМЕ);
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтСообщения.Отправитель,
ЧтСообщения.НомерСообщения)
Содержание раздела