Кратко суть проблемы можно озвучить цитатой из документации: "Передача параметра из источника в приемник доступна только при обмене между информационными базами на платформе 1С:Предприятие 8".
Ниже излагается способ передачи глобальных параметров при таком обмене без правки выгруженного из КД 2 модуля выгрузки и без правки самой КД 2.
Итак, в обработчике ПередВыгрузкойДанных пишем код:
Код 1C v 8.2 УП УзелПарам= СоздатьУзел( "ЗначениеПараметра" ) ;
УстановитьАтрибут( УзелПарам, "Имя" , "НашПараметр1" ) ;
УстановитьАтрибут( УзелПарам, "Тип" , "Строка" ) ;
ЗаписатьЭлемент( УзелПарам, "Значение" , "Значение нашего параметра 1" ) ;
ДобавитьПодчиненный( rootNode, УзелПарам) ;
УзелПарам= СоздатьУзел( "ЗначениеПараметра" ) ;
УстановитьАтрибут( УзелПарам, "Имя" , "НашПараметр2" ) ;
УстановитьАтрибут( УзелПарам, "Тип" , "Булево" ) ;
ЗаписатьЭлемент( УзелПарам, "Значение" , "true" ) ;
ДобавитьПодчиненный( rootNode, УзелПарам) ;
после этого данные параметры будут абсолютно штатно загружены в стандартной обработке "Универсальный обмен данными в формате XML (2.1.5)".
Ещё хотелось бы заметить, что содержимое обработчика ПослеЗагрузкиПараметров при таком обмене также не выгружается в файл обмена. Исправить данную оплошность можно так же, записав в обработчике ПередВыгрузкойДанных
Код 1C v 8.2 УП АлгПослеЗагрузкиПараметров=
"СтрокаКода1;" + РазделительСтрок+
"СтрокаКода2;" + РазделительСтрок+
"СтрокаКода3;" ;
ЗаписатьЭлемент( rootNode, "АлгоритмПослеЗагрузкиПараметров" , АлгПослеЗагрузкиПараметров) ;
Нюанс : чтобы иметь параметры на ранних стадиях загрузки, например, в обработчиках ПередЗагрузкойДанных или ПередОбработкой в ПОД (правилах очистки данных), нужно помещать выгружаемые параметры в корень узла с выгружаемыми данными:
Код 1C v 8.2 УП ИмяПараметра= "НашПараметр1" ;
ТипПараметра= "Строка" ;
ЗначениеПараметра= "Значение нашего параметра 1" ;
УзелПравил= rootNode. getElementsByTagName( "ПравилаОбмена" ) . item( 0 ) ;
УзелПередЗагрузкой= УзелПравил. getElementsByTagName( "ПередЗагрузкойДанных" ) . item( 0 ) ;
КоллУзлов= УзелПередЗагрузкой. childNodes;
Для НомУзла= 0 По КоллУзлов. length- 1 Цикл
ТекУзел= КоллУзлов. item( НомУзла) ;
Если ( ТекУзел. nodeType= 3 ) Тогда
ТекУзел. nodeValue= РазделительСтрок+ "Параметры." + ИмяПараметра+ "=" + ? ( ТипПараметра= "Строка" , """ " , "" ) +
ЗначениеПараметра+ ? ( ТипПараметра= "Строка" , """ " , "" ) + ";" + РазделительСтрок+ РазделительСтрок+
ТекУзел. nodeValue;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Автор: andrewks - Источник
Код 1C v 8.х
Процедура ПередатьПоFTP(ИмяФайла,ПутьФТП=Неопределено) Экспорт
Если ПутьФТП = Неопределено Тогда
ТекПутьФТП = ПараметрыСеанса. FTPПуть;
Иначе
ТекПутьФТП = ПутьФТП;
КонецЕсли ;
Скрипт= Новый ТекстовыйДокумент;
Скрипт. ДобавитьСтроку( "open " + ПараметрыСеанса. FTP) ;
Скрипт. ДобавитьСтроку( "user" ) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPЛогин) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPПароль) ;
Скрипт. ДобавитьСтроку( "binary" ) ;
Скрипт. ДобавитьСтроку( "cd " + ТекПутьФТП) ;
Скрипт. ДобавитьСтроку( "put " + ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + ИмяФайла) ;
Скрипт. ДобавитьСтроку( "bye" ) ;
Файл = Новый Файл( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" ) ;
Скрипт. Записать( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" , "windows-1251" ) ;
КомандаСистемы( "ftp -n -s:" + ПараметрыСеанса. ПутьКФайлуОбраза+ "\ftp.txt" ) ;
КонецПроцедуры
Процедура ПолучитьПоFTP(ИмяФайла,ПутьФТП=Неопределено) Экспорт
Если ПутьФТП = Неопределено Тогда
ТекПутьФТП = ПараметрыСеанса. FTPПуть;
Иначе
ТекПутьФТП = ПутьФТП;
КонецЕсли ;
Скрипт= Новый ТекстовыйДокумент;
Скрипт. ДобавитьСтроку( "open " + ПараметрыСеанса. FTP) ;
Скрипт. ДобавитьСтроку( "user" ) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPЛогин) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPПароль) ;
Скрипт. ДобавитьСтроку( "binary" ) ;
Скрипт. ДобавитьСтроку( "cd " + ТекПутьФТП) ;
Скрипт. ДобавитьСтроку( "get" ) ;
Скрипт. ДобавитьСтроку( ИмяФайла) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + ИмяФайла) ;
Скрипт. ДобавитьСтроку( "bye" ) ;
Файл = Новый Файл( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" ) ;
Скрипт. Записать( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" , "windows-1251" ) ;
КомандаСистемы( "ftp -n -s:" + ПараметрыСеанса. ПутьКФайлуОбраза+ "\ftp.txt" ) ;
КонецПроцедуры
Код 1C v 7.x
Функция ОтправитьФайлыЧерезFTP()
Попытка
Шел= СоздатьОбъект( "shell.application" ) ;
ПапкаФТП= Шел. namespace( "ftp://" + СокрЛП( ФТП_Пользователь) + ":" + СокрЛП( ФТП_Пароль) + "@" + СокрЛП( ФТП_УРЛ) + "/" + СокрЛП( ФТП_ПутьИсходящих) ) ;
ПапкаИсточник= Шел. namespace( КаталогИсходящих) ;
ПапкаЗагруженных = Шел. namespace( КаталогЗагруженных) ;
Предупреждение( "Подключение к FTP серверу..." , 1 ) ;
Темы= ПапкаИсточник. items( ) ;
ПапкаЗагруженных. copyhere( Темы) ;
ПапкаФТП. movehere( Темы) ;
Исключение
Предупреждение( "Внимание! Не удалось передать файлы адресату через FTP! Возможно, параметры FTP заданы неверно, либо отсутствует связь." ) ;
Возврат 0 ;
КонецПопытки ;
ФС. УстТекКаталог( КаталогИсходящих) ;
ПопытокПроверки = 3 ;
Для Сч = 1 По ПопытокПроверки Цикл
Если НЕ ( ( СокрЛП( ФС. НайтиПервыйФайл( "*.*" ) ) = "" ) или ( СокрЛП( ФС. НайтиПервыйФайл( "*.*" ) ) = "." ) ) Тогда
Если Сч = ПопытокПроверки Тогда
Предупреждение( "Внимание! Не удалось передать файлы адресату через FTP! Попробуйте совершить обмен позже." ) ;
Возврат 0 ;
КонецЕсли ;
Предупреждение( "Передача файлов...." , 3 ) ;
КонецЕсли ;
КонецЦикла ;
Возврат 1 ;
КонецФункции
Функция ПолучитьФайлыЧерезFTP()
Попытка
Шел= СоздатьОбъект( "shell.application" ) ;
ПапкаФТП= Шел. namespace( "ftp://" + СокрЛП( ФТП_Пользователь) + ":" + СокрЛП( ФТП_Пароль) + "@" + СокрЛП( ФТП_УРЛ) + "/" + СокрЛП( ФТП_ПутьВходящих) ) ;
ПапкаПриемник= Шел. namespace( КаталогВходящих) ;
ПапкаЗагруженных = Шел. namespace( КаталогЗагруженных) ;
Предупреждение( "Подключение к FTP серверу..." , 1 ) ;
Темы= ПапкаФТП. items( ) ;
ПапкаЗагруженных. copyhere( Темы) ;
ПапкаПриемник. movehere( Темы) ;
Исключение
Предупреждение( "Внимание! Не удалось получить файлы через FTP! Возможно, параметры FTP заданы неверно, либо отсутствует связь." ) ;
Возврат 0 ;
КонецПопытки ;
ПопытокПроверки = 3 ;
Для Сч = 1 По ПопытокПроверки Цикл
Если ПапкаФТП. items( ) . count> 0 Тогда
Если Сч = ПопытокПроверки Тогда
Предупреждение( "Внимание! Не удалось получить файлы через FTP! Попробуйте совершить обмен позже." ) ;
Возврат 0 ;
КонецЕсли ;
Предупреждение( "Получение файлов...." , 3 ) ;
КонецЕсли ;
КонецЦикла ;
Возврат 1 ;
КонецФункции
Код 1C v 7.x
ТекстВыгрузки. Записать( КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ТекстВыгрузки = "" ;
ТекстВыгрузки = СоздатьОбъект( "Текст" ) ;
ТекстВыгрузки. ДобавитьСтроку( "open " + "192.168.0.1" ) ;
ТекстВыгрузки. ДобавитьСтроку( "****" ) ;
ТекстВыгрузки. ДобавитьСтроку( "*****" ) ;
ТекстВыгрузки. ДобавитьСтроку( "put " + КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ТекстВыгрузки. ДобавитьСтроку( "bye" ) ;
ТекстВыгрузки. Записать( КаталогПользователя( ) + "ftp.txt" ) ;
ТекстВыгрузки = "" ;
КомандаСистемы( "ftp -s:" + КаталогПользователя( ) + "Ftp.txt>> " + ( КаталогПользователя( ) + "report.txt" ) ) ;
ФС. УдалитьФайл( КаталогПользователя( ) + "ftp.txt" ) ;
ТекстВыгрузки = СоздатьОбъект( "Текст" ) ;
ТекстВыгрузки. Открыть( КаталогПользователя( ) + "report.txt" ) ;
КС = ТекстВыгрузки. КоличествоСтрок( ) - 4 ;
Попытка
строкаКомплете = ТекстВыгрузки. ПолучитьСтроку( КС) ;
Если Найти( Нрег( строкаКомплете) , "226 transfer complete" ) = 0
Тогда а= 1 ; а= а/ 0 ;
КонецЕсли ;
тПротокол = ТекущееВремя( ) + " файл данных успешно отправлен на сервер интернет-магазина" + РазделительСтрок+ тПротокол;
Форма. Обновить( ) ;
ТекстВыгрузки = "" ;
ФС. УдалитьФайл( КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ФС. УдалитьФайл( КаталогПользователя( ) + "report.txt" ) ;
Исключение
тПротокол = ТекущееВремя( ) + " ПРОИЗОШЛА ОШИБКА ВО ВРЕМЯ ЗАГРУЗКИ СФОРМИРОВАННОГО ФАЙЛА НА СЕРВЕР ИНЕТРНЕТ-МАГАЗИНА" + РазделительСтрок+ тПротокол;
тПротокол = ТекущееВремя( ) + ИмяПрайса+ РазделительСтрок+ тПротокол;
Форма. Обновить( ) ;
ТекстВыгрузки. Показать( ) ;
ТекстВыгрузки = "" ;
КонецПопытки ;
Для этого можно использовать функционал следующих внешних компонент:
1. FormEx смотрите тут.
Код 1C v 7.x Сервис= СоздатьОбъект( "Сервис" ) ;
Сервис. РаскладкаКлавиатуры( "Russian" ) ;
2. Miracle смотрите тут.
3. NetaTable смотрите тут.
Код 1C v 7.x Если ( ЗагрузитьВнешнююКомпоненту( "NetaTable.dll" ) = 1 ) Тогда
РовнаяТаблица= СоздатьОбъект( "AddIn.NTable" ) ;
Иначе
Предупреждение( "Внешняя компонента AddIn.NetaTable НЕ подключена!!!" + РазделительСтрок+ "Работа программы невозможна!!!" ) ;
СтатусВозврата( 0 ) ;
Возврат
КонецЕсли ;
Процедура ПриНачалеВыбораЗначения(ИдентЭлемента,ФлагОтбора)
Если ИдентЭлемента = "Диагноз" Тогда
РовнаяТаблица. УстановитьРаскладку( 67699721 ) ;
ИначеЕсли ИдентЭлемента = "ИсточникФинансирования" Тогда
РовнаяТаблица. УстановитьРаскладку( 68748313 ) ;
КонецЕсли ;
КонецПроцедуры
А можно и без внешних компонент:
Код 1C v 7.x
Процедура СменитьРаскладку(Реж)
Если Не ( Константа. ВключатьНамЛоокВТелефонах = Истина ) Тогда
Возврат ;
КонецЕсли ;
wshShell= createObject( "wScript.shell" ) ;
Если Реж = "RUS" Тогда
wshShell. SendKeys( "^(8)" , 0 ) ;
ИначеЕсли Реж = "EN" Тогда
wshShell. SendKeys( "^(9)" , 0 ) ;
КонецЕсли ;
КонецПроцедуры
текст = СоздатьОбъект( "текст" ) ;
текст. ДобавитьСтроку( "Windows Registry Editor Version 5.00" ) ;
текст. ДобавитьСтроку( "" ) ;
текст. ДобавитьСтроку( "[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000100]" ) ;
текст. ДобавитьСтроку( """ Virtual Key"" =hex:39,00,00,00" ) ;
текст. ДобавитьСтроку( """ Key Modifiers"" =hex:02,c0,00,00" ) ;
текст. ДобавитьСтроку( """ Target IME"" =hex:09,04,09,04" ) ;
текст. ДобавитьСтроку( "" ) ;
текст. ДобавитьСтроку( "[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000101]" ) ;
текст. ДобавитьСтроку( """ Virtual Key"" =hex:38,00,00,00" ) ;
текст. ДобавитьСтроку( """ Key Modifiers"" =hex:02,c0,00,00" ) ;
текст. ДобавитьСтроку( """ Target IME"" =hex:19,04,19,04" ) ;
ИмяФайла = КаталогИБ( ) + "LangHotKey.reg" ;
Попытка
текст. Записать( ИмяФайла) ;
wshShell= createObject( "wScript.shell" ) ;
StrComand = "regedit /S " + СокрЛП( ИмяФайла) ;
wshShell. Run( StrComand, 1 ) ;
Для Сч= 1 По 50000 Цикл
КонецЦикла ;
ФС. УдалитьФайл( ИмяФайла) ;
Исключение
КонецПопытки ;
Получает из users.usr список пользователей, каталоги пользователей и даже хеши паролей
Код 1C v 7.x
FSO= createobject( "Scripting.FileSystemObject" ) ;
WshShell = CreateObject( "WScript.Shell" ) ;
Txt= FSO. OpenTextFile( КаталогИБ( ) + "usrdef\users.usr" ) ;
LineUser= "" ;
ChI= 0 ;
Пока Txt. AtEndOfStream= 0 Цикл
Chi= Chi+ 1 ;
Buf= Txt. Read( 1 ) ;
Если КодСимв( Buf) > 31 Тогда
LineUser= LineUser+ Buf;
КонецЕсли ;
КонецЦикла ;
LineBof= "{" + chr( 34 ) + "Container.Contents" + chr( 34 ) + "," ;
LineUser= Сред( LineUser, Найти( LineUser, LineBof) + 23 ) ;
LineUser= Сред( LineUser, 1 , Найти( LineUser, "}}" ) ) ;
LineUser= СтрЗаменить( LineUser, РазделительСтрок, " " ) ;
LineUser= СтрЗаменить( LineUser, "},{" , РазделительСтрок) ;
Для к= 1 По СтрКоличествоСтрок( LineUser) Цикл
а= СтрЗаменить( СтрПолучитьСтроку( LineUser, к) , Симв( 34 ) , "" ) ;
а= СтрЗаменить( СтрПолучитьСтроку( LineUser, к) , "}" , "" ) ;
а= Сред( а, 19 ) ;
а= Сред( а, Найти( а, "," ) + 1 ) ;
а= Сред( а, 1 , Найти( а, "," ) - 1 ) ;
а= СтрЗаменить( а, """ " , "" ) ;
списПользователи. Установить( а, а) ;
КонецЦикла ;
списПользователи. ТекущаяСтрока( 1 ) ;
Посмотрите еще:
Как получить список зарегистрированных пользователей базы 1С Код 1C v 8.х Соединение = Новый HTTPСоединение( "export.rbc.ru" ) ;
ИмяФайла = ПолучитьИмяВременногоФайла( ".txt" ) ;
СтрокаСоединения= "/free/" + Источник+ "/free.fcgi?period=DAILY&tickers=" + Валюта1 + "&d1=" + День1 + "&m1=" + Месяц1 + "&y1=" + Год1 + "&d2=" + День2 + "&m2=" + Месяц2 + "&y2=" + Год2 + "&separator=%7C&data_format=BROWSER" ;
СтрокаСоединения= СтрЗаменить( СтрокаСоединения, " " , "" ) ;
Попытка
Соединение. Получить( СтрокаСоединения, ИмяФайла) ;
Исключение
Сообщить( "Невозможно получить курс по адресу http://export.rbc.ru" + СтрокаСоединения) ;
КонецПопытки ;
КурсыТекст= Новый ТекстовыйДокумент;
КурсыТекст. Прочитать( ИмяФайла) ;
Код 1C v 8.х
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект( "MSXML2.XMLHTTP" ) ;
соминет. open ( "GET" , Адресс, Ложь ) ;
соминет. send( ) ;
Возврат соминет. responseText;
КонецФункции
Функция ПреобразоватьДату(дат)
Возврат Формат( Дат, "ДФ="" гггг/ММ/дд"" " ) ;
КонецФункции
Процедура КнопкаЗагрузитьКурсы(Элемент)
Для А = 1 по Список. Количество( ) цикл
Если Список[а- 1 ]. Пометка тогда
Сообщить( "Загружаем курсы для " + Строка( Список[а- 1 ]. Значение) ) ;
Код = Строка( Список[а- 1 ]. Значение. Код) ;
Дат = ПериодС;
Пока Дат < = ПериодПо цикл
Стр = ПолучитьКакСтроку( "http://cbrates.rbc.ru/tsv/" + Код+ "/" + ПреобразоватьДату( Дат) + ".tsv" ) ;
Поз = Найти( Стр, Символы. Таб) ;
Если Поз = 0 Тогда
Дат = Дат + 86400 ;
Продолжить;
КонецЕсли ;
Кратность = Число( СокрЛП( Лев( стр, Поз- 1 ) ) ) ;
курс = Число( СокрЛП( Сред( Стр, Поз+ 1 , СтрДлина( Стр) - Поз) ) ) ;
Сообщить( "Дата=" + Строка( Дат) + " Курс=" + Строка( курс) + " Кратность=" + Строка( Кратность) ) ;
Запись = РегистрыСведений. КурсыВалют. СоздатьМенеджерЗаписи( ) ;
Запись. Период = Дат;
Запись. Валюта = Список[а- 1 ]. Значение. Ссылка;
Запись. Курс = Курс;
Запись. Кратность = Кратность;
Запись. Записать( Истина ) ;
Дат = Дат + 86400 ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Код 1C v 7.x // Взято с http://www.1c-club.kz IUnknown
//Небольшая обработка для получения курса валют размещенной на странице Национального Банка РК.
//Внимание: работоспособность данной обработки может быть нарушена, если дизайнеры сайта НБ РК изменят формат страницы с //официальным курсом валюта. Но не большой анализ нового формата и работоспособность обработки будет восстановлена.
// шаблон для отображаемой на форме таблице значения
перем тзПустышка;
//*******************************************
// ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
//
// Параметры:
// стрНазвание - Строка. Наименование реквизита формы инициюрующей
// вызов процедуры.
// чисФлаг - Число. Флаг станадартной обработки иницации нажатия
// кнопки выбора значения.
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Переопределенная процедура инициирующая при нажатии кнопки
// выбора значения реквизита формы.
//
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
// Если инициировали из реквизита "стрУРЛа"
если стрНазвание = "стрУРЛа" тогда
// откроем страницу с введенным URL
запуститьприложение(стрУРЛа);
конецесли;
конецпроцедуры
//*******************************************
// кнПолучить()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Процедура получающая курсы валют с URL находящегося в
// строковом реквизите формы "стрУРЛа". Пытается по указаноому URL
// получить страницу и распарсить ее.
//
// ПРЕДУПРЕЖДЕНИЕ:
// В случае измения формата данных представленных на странице, возможно
// будет работать не правильно.
//
процедура кнПолучить()
// сгенирим имя файла для временного хранения содержимого
// страницы курса валют Национального банка
стрИмяФайла = каталогпользователя() + "$$$$.###";
// создадим объект XMLHttpRequest
олеХМЛ = создатьобъект("Microsoft.XMLHTTP");
// иницируем его типом запроса и нужным нам URL
олеХМЛ.Open("GET", стрУРЛа, 0);
// отправим запрос для обработки серверу
олеХМЛ.Send();
// создадим "поток" через ADODDB для работы с данными
олеАДО = создатьобъект("ADODB.Stream");
// зададим тип и режим потока
олеАДО.Mode = 3;
олеАДО.Type = 1;
// откроем его
олеАДО.Open();
// создадим объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// установим язык сценариев
олеШелл.Language = "vbscript";
// добавим созданные объекты
олеШелл.AddObject("oleADO", олеАДО);
олеШелл.AddObject("oleXML", олеХМЛ);
// с помощью скрипта запишем в поток ADO данные из
// объекта XMLHttpRequest
// то есть содержимое страницы
олеШелл.Eval("oleADO.Write(oleXML.ResponseBody)");
// запишем данные во временный файл
олеАДО.SaveToFile(стрИмяФайла, 2);
// закроем данный поток
олеАДО.Close();
// для ускорения парсера занесем весь файл в строковую
// переменую с разделителем строк
// для этого инициализуруем поток установкой
// соотвествующим режимом и типом
олеАДО.Mode= 3;
олеАДО.Type = 2;
// так как страница курса валют НБК имеет формат
// символов UTF-8, то установим соотвествующий набор
олеАДО.CharSet="UTF-8";
// откроем поток
олеАДО.Open();
// загрузим содержимое нашего файла в поток
олеАДО.LoadFromFile(стрИмяФайла);
// обнулим временную строковую переменную
стрТемп = "";
// в цикле получим из потока все строки
пока олеАДО.EOS() = 0 цикл
// и запишем их во временную переменую, добавив разделитель строк
стрТемп = стрТемп + олеАДО.ReadText(-2) + разделительстрок ;
конеццикла;
// закроем поток
олеАДО.Close();
// удалим временный файл
фс.УдалитьФайл(стрИмяФайла);
// найдем в строке позицию начала блока с данными о курсе
чисПозиция = найти(стрТемп, "Официальные курсы валют на");
если чисПозиция = 0 тогда
// если позиции нет ... то мы имем другую страницу
// или другой формат страницы...
предупреждение("Не получилось получить курсы валют");
иначе
// создаим временную таблицу значений
// для более шустрого заполения из-за отстуствия вызова
// функции перерисовки таблицы при изменении данных
тзТемп = создатьобъект("ТаблицаЗначений");
// установим для нее нужный формат
тзПустышка.Выгрузить(тзТемп);
// отрежем все лишнее
стрТемп = сред(стрТемп, чисПозиция);
// получим дату курса
дтКурса = дата(стрзаменить(стрполучитьстроку(стрТемп, 2), "/", "."));
// первая строка с курсом валюты находится на 18 строке от начала
// после удаления мусора
чисПозиция = 18;
// узнаем сколько всего строк в многострочке
чисКоличествоСтрок = стрколичествострок(стрТемп);
// получим строку
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
// если в строке есть подстрока ... то значит это наверное очередная валюта
пока найти(стрТекущая, "input type=""checkbox"" name=""idval""") > 0 цикл
// добавляем новую строку
тзТемп.НоваяСтрока();
// получаем строку со смещением 1 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 1);
// используя фичу 1С по преобразованию, получим число
// за сколько единиц валюты имеем курс в тенге
тзТемп.Количество = число(стрТекущая);
// путем убирания "мусора" получаем наименование валюты
тзТемп.Наименование = сокрлп(стрзаменить(стрзаменить(стрТекущая, тзТемп.Количество, ""), "</td>", ""));
// получаем строку со смещением 2 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 2);
// убираем html мусор
стрТекущая = сокрлп(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// получаем код валюты
тзТемп.Код1 = лев(стрТекущая, 3);
// получаем код валюты "Тенге"
тзТемп.Код2 = прав(стрТекущая, 3);
// получаем строку со смещением 5 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 5);
// очищаем от мусора и преобразуем в число... получаем курс
тзТемп.Курс = число(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// увеличиваем позицию на 17 ...
чисПозиция = чисПозиция + 17;
если чисПозиция > чисКоличествоСтрок тогда
// если позици дальше имеющихся строк
// то все курсов больше нет
стрТекущая = "";
иначе
// получаем очередную строку для разбора
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
конецесли;
конеццикла;
// сформированую таблицу копируем в таблицу на форме
тзТемп.Выгрузить(тзКурсов);
конецесли;
конецпроцедуры
//*******************************************
// установим значение реквизита текущим URL по которому можно получить курс валют
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D";
// формируем формат таблицы
тзПустышка = создатьобъект("ТаблицаЗначений");
тзПустышка.НоваяКолонка("Количество", "число", 3, 0, "", 5);
тзПустышка.НоваяКолонка("Наименование", "строка", , , "Наименование", 70);
тзПустышка.НоваяКолонка("Код1", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Код2", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Курс", "число", 7, 2, "Курс", 10);
// копируем получившийся формат в таблицу на форме
тзПустышка.Выгрузить(тзКурсов);
В 7.7 Откройте Справочник Контрагенты - Форма Элемента, двойным щелчком по полю ИНН, на закладке Дополнительно в поле формула введите ПроверкаИНН()
И в Модуль добавьте процедуру ПроверкаИНН()
Код 1C v 7.x Процедура ПроверкаИНН()
СпрКонтрагенты = СоздатьОбъект( "Справочник.Контрагенты" ) ;
Если СпрКонтрагенты. НайтиПоРеквизиту( "ИНН" , ИНН, 1 ) = 1 Тогда
Предупреждение( "Найден контрагент с таким же ИНН :" + РазделительСтрок+ Строка( СпрКонтрагенты. Код) + " - " + Строка( СпрКонтрагенты) ) ;
КонецЕсли ;
КонецПроцедуры
В 8- ой версии, откройте Справочник Контрагенты - Форму Элемента, двойным щелчком по полю ИНН, в событиях ПриИзменении введите ПроверкаИНН()
И в Модуль добавьте процедуру ПроверкаИНН()
Код 1C v 8.х Процедура ПроверкаИНН()
СпрКонтрагенты = Справочники. Контрагенты;
Если СпрКонтрагенты. НайтиПоРеквизиту( "ИНН" , ИНН) Тогда
Предупреждение( "Найден контрагент с таким же ИНН :" + РазделительСтрок+ Строка( СпрКонтрагенты. Код) + " - " + Строка( СпрКонтрагенты) ) ;
КонецЕсли ;
КонецПроцедуры
Теперь при вводе ИНН происходит проверка, если Контрагент с таким ИНН уже есть в базе, то выдается Предупреждение!
Код 1C v 8.2 УП СпрКонтрагенты = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , Запись. ИНН) ;
Если Не СпрКонтрагенты= Справочники. Контрагенты. ПустаяСсылка( ) Тогда
Предупреждение( "Найден контрагент с таким же ИНН : " + Строка( СпрКонтрагенты. Код) + " - " + Строка( СпрКонтрагенты) ) ;
КонецЕсли ;
Код 1C v 8.х
Сервер= "IP-адрес-сайта" ;
ПользовательСервера= "имя-пользователя-базы-данных" ;
ПарольСервера= "пароль-пользователя-базы-данных" ;
БазаСервера= "название-SQL-базы-данных" ;
Соединение = Новый COMОбъект( "ADODB.Connection" ) ;
Соединение_param = "driver={MySQL ODBC 5.1 Driver}; server=" + СокрЛП( Сервер) + "; uid=" + СокрЛП( ПользовательСервера) + "; pwd=" + СокрЛП( ПарольСервера) + "; database=" + СокрЛП( БазаСервера) + "; STMT=SET CHARACTER SET utf8" ;
Try
Соединение. open( Соединение_param) ;
СоединениеУстановлено = Истина ;
Сообщить( "Соединение установлено" ) ;
Except
ТекстСообщения = "" + ТекущаяДата( ) + " Connection error: " + ОписаниеОшибки( ) ;
Сообщить( ТекстСообщения) ;
СоединениеУстановлено = Ложь ;
return;
EndTry;
Код 1C v 8.х ]
Соединение = Новый COMОбъект( "ADODB.Connection" ) ;
ConnectionString = "driver={SQL Server}; server=; uid=; Pwd=; Database = " ;
Попытка
Соединение. Open( ConnectionString) ;
Сообщить( "Соединение осуществлено в " + ТекущаяДата( ) ) ;
Исключение
Предупреждение( "Невозможно установить соединение" ) ;
Возврат ;
КонецПопытки ;
ТекстЗакпроса = "...................." ;
НаборЗаписей = Новый COMОбъект( "ADODB.RecordSet" ) ;
НаборЗаписей. ActiveConnection = Соединение;
НаборЗаписей. Open( ТекстЗапроса) ;
Пока не НаборЗаписей. Eof( ) Цикл
НаборЗаписей. MoveNext( ) ;
КонецЦикла ;
НаборЗаписей. Close( ) ;
Соединение. Close( ) ;
Сообщить( "Обработка завершена в " + ТекущаяДата( ) ) ;
Код 1C v 7.x DB = СоздатьОбъект( "ODBCDatabase" ) ;
DB. Соединение( "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=IP_Супер_мега_сервера; DATABASE=Мега_база; USER=Супер_юзер; PASSWORD=пароль_супер_мега_юзера; OPTION=3;" ) ;
RS = СоздатьОбъект( "ODBCRecordSet" ) ;
RS. SetDatabase( DB) ;
Если RS. Выполнить( "set names cp1251" ) = 0 Тогда
Сообщить( "Ошибка подключения к MySQL" + РазделительСтрок + RS. ПолучитьОписаниеОшибки( ) ) ;
СтатусВозврата( 0 ) ;
Возврат ;
КонецЕсли ;
Используя DSN . Большой плюс dsn есть режим проверки и также в текстах 1с
уже не нужен пользователь и пароль. Все детали скрыты в dsn
вот мой успешно работающий код для MY SQL
Код 1C v 7.x sql = СоздатьОбъект( "ODBCDatabase" ) ;
Имя0 = "DragNet" ;
Фл1 = sql. Соединение( "DSN=" + Имя0 + ";" ) ;
Если Фл1 = 0 Тогда
Сообщить( "Не смогли открыть DSN = " + Имя0 ) ;
Сообщить( "Ошибка = " + sql. ПолучитьОписаниеОшибки( ) ) ;
Иначе
sql. УстТолькоЧтение( 1 ) ;
КонецЕсли ;
rc = СоздатьОбъект( "ODBCRecordSet" ) ;
rc. УстБД( sql) ;
еще, драйвер 3.51:
Код 1C v 7.x
клМускул = СоздатьОбъект( "ODBCDatabase" ) ;
клМускул. СтрокаСоединения = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;
|Port=3306;Database=_1c;User=_1c_user; Password=_1c_pass;
|Option=3;" ;
Результат = клМускул. СтрокаСоединения;
ПроверитьРавенство( Результат, "Driver={MySQL ODBC 3.51 Driver};Server=localhost;
|Port=3306;Database=_1c;User=_1c_user; Password=_1c_pass;
|Option=3;" ) ;
При помощи приведенных ниже функций можно вывести дату прописью, например:
03.08.2009 - третье августа две тысячи девятого года
Код 1C v 8.х
Функция ДатаПрописью(ДП) Экспорт
стрРез = "" ;
Д= Формат( ДП, "ДЛФ=D" ) ;
спсМес = Новый СписокЗначений;
спсМес. Добавить( "января" ) ;
спсМес. Добавить( "февраля" ) ;
спсМес. Добавить( "марта" ) ;
спсМес. Добавить( "апреля" ) ;
спсМес. Добавить( "мая" ) ;
спсМес. Добавить( "июня" ) ;
спсМес. Добавить( "июля" ) ;
спсМес. Добавить( "августа" ) ;
спсМес. Добавить( "сентября" ) ;
спсМес. Добавить( "октября" ) ;
спсМес. Добавить( "ноября" ) ;
спсМес. Добавить( "декабря" ) ;
спсЧисл = Новый СписокЗначений;
спсЧисл. Добавить( "первое" , "первого" ) ;
спсЧисл. Добавить( "второе" , "второго" ) ;
спсЧисл. Добавить( "третье" , "третьего" ) ;
спсЧисл. Добавить( "четвертое" , "четвертого" ) ;
спсЧисл. Добавить( "пятое" , "пятого" ) ;
спсЧисл. Добавить( "шестое" , "шестого" ) ;
спсЧисл. Добавить( "седьмое" , "седьмого" ) ;
спсЧисл. Добавить( "восьмое" , "восьмого" ) ;
спсЧисл. Добавить( "девятое" , "девятого" ) ;
спсЧислИм = Новый СписокЗначений;
спсЧислИм. Добавить( "тысяча" , "тысячного" ) ;
спсЧислИм. Добавить( "две тысячи" , "двухтысячного" ) ;
спсЧислИм. Добавить( "три тысячи" , "трехтысячного" ) ;
спсЧислИм. Добавить( "четыре тысячи" , "четырёхтысячного" ) ;
спсЧислИм. Добавить( "пять" , "пятитысячного" ) ;
спсЧислИм. Добавить( "шесть" , "шеститысячного" ) ;
спсЧислИм. Добавить( "семь" , "семитысячного" ) ;
спсЧислИм. Добавить( "восемь" , "восьмитысячного" ) ;
спсЧислИм. Добавить( "девять" , "девятитысячного" ) ;
спсСотни = Новый СписокЗначений;
спсСотни. Добавить( "сто" ) ;
спсСотни. Добавить( "двести" ) ;
спсСотни. Добавить( "триста" ) ;
спсСотни. Добавить( "четыреста" ) ;
спсСотни. Добавить( "пятьсот" ) ;
спсСотни. Добавить( "шестьсот" ) ;
спсСотни. Добавить( "семьсот" ) ;
спсСотни. Добавить( "восемьсот" ) ;
спсСотни. Добавить( "девятьсот" ) ;
спсДесИм = Новый СписокЗначений;
спсДесИм. Добавить( "" , "десятого" ) ;
спсДесИм. Добавить( "двадцать" , "двадцатого" ) ;
спсДесИм. Добавить( "тридцать" , "тридцатого" ) ;
спсДесИм. Добавить( "сорок" , "сорокового" ) ;
спсДесИм. Добавить( "пятьдесят" , "пятидесятого" ) ;
спсДесИм. Добавить( "шестьдесят" , "шестидесятого" ) ;
спсДесИм. Добавить( "семьдесят" , "семидесятого" ) ;
спсДесИм. Добавить( "восемьдесят" , "восьмидесятого" ) ;
спсДесИм. Добавить( "девяносто" , "девяностого" ) ;
спсСубДесРод = Новый СписокЗначений;
спсСубДесРод. Добавить( "одиннадцатого" ) ;
спсСубДесРод. Добавить( "двенадцатого" ) ;
спсСубДесРод. Добавить( "тринадцатого" ) ;
спсСубДесРод. Добавить( "четырнадцатого" ) ;
спсСубДесРод. Добавить( "пятнадцатого" ) ;
спсСубДесРод. Добавить( "шестнадцатого" ) ;
спсСубДесРод. Добавить( "семнадцатого" ) ;
спсСубДесРод. Добавить( "восемнадцатого" ) ;
спсСубДесРод. Добавить( "девятнадцатого" ) ;
спсДес = Новый СписокЗначений;
спсДес. Добавить( "десятое" ) ;
спсДес. Добавить( "двадцатое" , "двадцать" ) ;
спсДес. Добавить( "тридцатое" , "тридцать" ) ;
спсДес. Добавить( "сороковое" , "тридцать" ) ;
спсДес. Добавить( "пятидесятое" , "тридцать" ) ;
спсДес. Добавить( "шестидесятое" , "тридцать" ) ;
спсДес. Добавить( "семидесятое" , "тридцать" ) ;
спсСубДес = Новый СписокЗначений;
спсСубДес. Добавить( "одиннадцатое" ) ;
спсСубДес. Добавить( "двенадцатое" ) ;
спсСубДес. Добавить( "тринадцатое" ) ;
спсСубДес. Добавить( "четырнадцатое" ) ;
спсСубДес. Добавить( "пятнадцатое" ) ;
спсСубДес. Добавить( "шестнадцатое" ) ;
спсСубДес. Добавить( "семнадцатое" ) ;
спсСубДес. Добавить( "восемнадцатое" ) ;
спсСубДес. Добавить( "девятнадцатое" ) ;
спсДаты = СтрЗаменить( СокрЛП( Д) , "." , Символы. ПС) ;
стрДень = СокрЛП( Число( СтрПолучитьСтроку( спсДаты, 1 ) ) ) ;
Если СтрДлина( стрДень) = 1 Тогда
стрДень = спсЧисл. Получить( Число( стрДень) - 1 ) . Значение;
Иначе
десДень = Число( Лев( стрДень, 1 ) ) ;
едДень = Число( Прав( стрДень, 1 ) ) ;
Если едДень= 0 Тогда
стрДень = спсДес. Получить( десДень- 1 ) . Значение;
Иначе
Если десДень> 1 Тогда
т = Строка( спсДес. Получить( десДень- 1 ) ) ;
стрДень = т+ " " + Строка( спсЧисл. Получить( едДень- 1 ) . Значение) ;
Иначе
стрДень = спсСубДес. Получить( едДень- 1 ) . Значение;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
стрМес = спсМес. Получить( Число( СтрПолучитьСтроку( спсДаты, 2 ) ) - 1 ) . Значение;
стрГод = СтрПолучитьСтроку( спсДаты, 3 ) ;
длинаГода = СтрДлина( стрГод) ;
Если длинаГода= 4 Тогда
тыс = Сред( стрГод, 1 , 1 ) ; сот = Сред( стрГод, 2 , 1 ) ; дес = Сред( стрГод, 3 , 1 ) ; ед = Сред( стрГод, 4 , 1 ) ;
_т = спсЧислИм. Получить( Число( тыс) - 1 ) . Значение;
Если ( Число( сот) = 0 ) и ( Число( дес) = 0 ) и ( Число( ед) = 0 ) Тогда
миллениум = Строка( спсЧислИм. Получить( Число( тыс) - 1 ) ) ;
стрГод = миллениум;
Иначе
с = "" ; дс = "" ; е = "" ;
Если Число( сот) < > 0 Тогда
с = спсСотни. Получить( Число( сот) - 1 ) . Значение;
КонецЕсли ;
Если Число( дес) < > 0 Тогда
Если Число( ед) = 0 Тогда
дг = Строка( спсДесИм. Получить( Число( дес) - 1 ) ) ;
дс = дг;
Иначе
дс = спсСубДесРод. Получить( Число( ед) - 1 ) . Значение;
КонецЕсли ;
КонецЕсли ;
Если ( Число( дес) > 1 ) или ( Число( дес) = 0 ) Тогда
Если Число( ед) < > 0 Тогда
е = Строка( спсЧисл. Получить( Число( ед) - 1 ) ) ;
КонецЕсли ;
КонецЕсли ;
стрГод = Строка( _т) + " " + Строка( с) + " " + Строка( дс) + " " + Строка( е) ;
КонецЕсли ;
Иначе
КонецЕсли ;
стрГод = стрГод+ " года" ;
стрГод = СтрЗаменить( стрГод, " " , " " ) ;
стрРез = Строка( стрДень) + " " + Строка( стрМес) + " " + Строка( стрГод) ;
стрРез = СтрЗаменить( стрРез, " " , " " ) ;
Возврат стрРез;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
сообщить( ДатаПрописью( РеквизитДатаНаФорме) ) ;
КонецПроцедуры
Код 1C v 7.x
Функция глПрописьДата(Д) Экспорт
стрРез = "" ;
спсМес = СоздатьОбъект( "СписокЗначений" ) ;
спсМес. ДобавитьЗначение( "января" ) ;
спсМес. ДобавитьЗначение( "февраля" ) ;
спсМес. ДобавитьЗначение( "марта" ) ;
спсМес. ДобавитьЗначение( "апреля" ) ;
спсМес. ДобавитьЗначение( "мая" ) ;
спсМес. ДобавитьЗначение( "июня" ) ;
спсМес. ДобавитьЗначение( "июля" ) ;
спсМес. ДобавитьЗначение( "августа" ) ;
спсМес. ДобавитьЗначение( "сентября" ) ;
спсМес. ДобавитьЗначение( "октября" ) ;
спсМес. ДобавитьЗначение( "ноября" ) ;
спсМес. ДобавитьЗначение( "декабря" ) ;
спсЧисл = СоздатьОбъект( "СписокЗначений" ) ;
спсЧисл. ДобавитьЗначение( "первое" , "первого" ) ;
спсЧисл. ДобавитьЗначение( "второе" , "второго" ) ;
спсЧисл. ДобавитьЗначение( "третье" , "третьего" ) ;
спсЧисл. ДобавитьЗначение( "четвертое" , "четвертого" ) ;
спсЧисл. ДобавитьЗначение( "пятое" , "пятого" ) ;
спсЧисл. ДобавитьЗначение( "шестое" , "шестого" ) ;
спсЧисл. ДобавитьЗначение( "седьмое" , "седьмого" ) ;
спсЧисл. ДобавитьЗначение( "восьмое" , "восьмого" ) ;
спсЧисл. ДобавитьЗначение( "девятое" , "девятого" ) ;
спсЧислИм = СоздатьОбъект( "СписокЗначений" ) ;
спсЧислИм. ДобавитьЗначение( "тысяча" , "тысячного" ) ;
спсЧислИм. ДобавитьЗначение( "две тысячи" , "двухтысячного" ) ;
спсЧислИм. ДобавитьЗначение( "три тысячи" , "трехтысячного" ) ;
спсЧислИм. ДобавитьЗначение( "четыре тысячи" , "четырёхтысячного" ) ;
спсЧислИм. ДобавитьЗначение( "пять" , "пятитысячного" ) ;
спсЧислИм. ДобавитьЗначение( "шесть" , "шеститысячного" ) ;
спсЧислИм. ДобавитьЗначение( "семь" , "семитысячного" ) ;
спсЧислИм. ДобавитьЗначение( "восемь" , "восьмитысячного" ) ;
спсЧислИм. ДобавитьЗначение( "девять" , "девятитысячного" ) ;
спсСотни = СоздатьОбъект( "СписокЗначений" ) ;
спсСотни. ДобавитьЗначение( "сто" ) ;
спсСотни. ДобавитьЗначение( "двести" ) ;
спсСотни. ДобавитьЗначение( "триста" ) ;
спсСотни. ДобавитьЗначение( "четыреста" ) ;
спсСотни. ДобавитьЗначение( "пятьсот" ) ;
спсСотни. ДобавитьЗначение( "шестьсот" ) ;
спсСотни. ДобавитьЗначение( "семьсот" ) ;
спсСотни. ДобавитьЗначение( "восемьсот" ) ;
спсСотни. ДобавитьЗначение( "девятьсот" ) ;
спсДесИм = СоздатьОбъект( "СписокЗначений" ) ;
спсДесИм. ДобавитьЗначение( "" , "десятого" ) ;
спсДесИм. ДобавитьЗначение( "двадцать" , "двадцатого" ) ;
спсДесИм. ДобавитьЗначение( "тридцать" , "тридцатого" ) ;
спсДесИм. ДобавитьЗначение( "сорок" , "сорокового" ) ;
спсДесИм. ДобавитьЗначение( "пятьдесят" , "пятидесятого" ) ;
спсДесИм. ДобавитьЗначение( "шестьдесят" , "шестидесятого" ) ;
спсДесИм. ДобавитьЗначение( "семьдесят" , "семидесятого" ) ;
спсДесИм. ДобавитьЗначение( "восемьдесят" , "восьмидесятого" ) ;
спсДесИм. ДобавитьЗначение( "девяносто" , "девяностого" ) ;
спсСубДесРод = СоздатьОбъект( "СписокЗначений" ) ;
спсСубДесРод. ДобавитьЗначение( "одиннадцатого" ) ;
спсСубДесРод. ДобавитьЗначение( "двенадцатого" ) ;
спсСубДесРод. ДобавитьЗначение( "тринадцатого" ) ;
спсСубДесРод. ДобавитьЗначение( "четырнадцатого" ) ;
спсСубДесРод. ДобавитьЗначение( "пятнадцатого" ) ;
спсСубДесРод. ДобавитьЗначение( "шестнадцатого" ) ;
спсСубДесРод. ДобавитьЗначение( "семнадцатого" ) ;
спсСубДесРод. ДобавитьЗначение( "восемнадцатого" ) ;
спсСубДесРод. ДобавитьЗначение( "девятнадцатого" ) ;
спсДес = СоздатьОбъект( "СписокЗначений" ) ;
спсДес. ДобавитьЗначение( "десятое" ) ;
спсДес. ДобавитьЗначение( "двадцатое" , "двадцать" ) ;
спсДес. ДобавитьЗначение( "тридцатое" , "тридцать" ) ;
спсДес. ДобавитьЗначение( "сороковое" , "тридцать" ) ;
спсДес. ДобавитьЗначение( "пятидесятое" , "тридцать" ) ;
спсДес. ДобавитьЗначение( "шестидесятое" , "тридцать" ) ;
спсДес. ДобавитьЗначение( "семидесятое" , "тридцать" ) ;
спсСубДес = СоздатьОбъект( "СписокЗначений" ) ;
спсСубДес. ДобавитьЗначение( "одиннадцатое" ) ;
спсСубДес. ДобавитьЗначение( "двенадцатое" ) ;
спсСубДес. ДобавитьЗначение( "тринадцатое" ) ;
спсСубДес. ДобавитьЗначение( "четырнадцатое" ) ;
спсСубДес. ДобавитьЗначение( "пятнадцатое" ) ;
спсСубДес. ДобавитьЗначение( "шестнадцатое" ) ;
спсСубДес. ДобавитьЗначение( "семнадцатое" ) ;
спсСубДес. ДобавитьЗначение( "восемнадцатое" ) ;
спсСубДес. ДобавитьЗначение( "девятнадцатое" ) ;
спсДаты = СтрЗаменить( СокрЛП( Д) , "." , РазделительСтрок) ;
стрДень = СокрЛП( Число( СтрПолучитьСтроку( спсДаты, 1 ) ) ) ;
Если СтрДлина( стрДень) = 1 Тогда
стрДень = спсЧисл. ПолучитьЗначение( Число( стрДень) ) ;
Иначе
десДень = Число( Лев( стрДень, 1 ) ) ;
едДень = Число( Прав( стрДень, 1 ) ) ;
Если едДень= 0 Тогда
стрДень = спсДес. ПолучитьЗначение( десДень) ;
Иначе
Если десДень> 1 Тогда
т = "" ; спсДес. ПолучитьЗначение( десДень, т) ;
стрДень = т+ " " + спсЧисл. ПолучитьЗначение( едДень) ;
Иначе
стрДень = спсСубДес. ПолучитьЗначение( едДень) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
стрМес = спсМес. ПолучитьЗначение( Число( СтрПолучитьСтроку( спсДаты, 2 ) ) ) ;
стрГод = СтрПолучитьСтроку( спсДаты, 3 ) ;
длинаГода = СтрДлина( стрГод) ;
Если длинаГода= 4 Тогда
тыс = Сред( стрГод, 1 , 1 ) ; сот = Сред( стрГод, 2 , 1 ) ; дес = Сред( стрГод, 3 , 1 ) ; ед = Сред( стрГод, 4 , 1 ) ;
_т = спсЧислИм. ПолучитьЗначение( Число( тыс) ) ;
Если ( Число( сот) = 0 ) и ( Число( дес) = 0 ) и ( Число( ед) = 0 ) Тогда
миллениум = "" ; спсЧислИм. ПолучитьЗначение( Число( тыс) , миллениум) ;
стрГод = миллениум;
Иначе
с = "" ; дс = "" ; е = "" ;
Если Число( сот) < > 0 Тогда
с = спсСотни. ПолучитьЗначение( Число( сот) ) ;
КонецЕсли ;
Если Число( дес) < > 0 Тогда
Если Число( ед) = 0 Тогда
_дг = "" ; спсДесИм. ПолучитьЗначение( Число( дес) , _дг) ;
дс = _дг;
Иначе
Если Число( дес) > 1 Тогда
дс = спсДесИм. ПолучитьЗначение( Число( дес) ) ;
Иначе
дс = спсСубДесРод. ПолучитьЗначение( Число( ед) ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Если ( Число( дес) > 1 ) или ( Число( дес) = 0 ) Тогда
Если Число( ед) < > 0 Тогда
спсЧисл. ПолучитьЗначение( Число( ед) , е) ;
КонецЕсли ;
КонецЕсли ;
стрГод = _т+ ? ( ПустоеЗначение( с) = 0 , " " , "" ) + с+ ? ( ПУстоеЗначение( дс) = 0 , " " , "" ) + дс+ " " + е;
КонецЕсли ;
Иначе
КонецЕсли ;
стрГод = стрГод+ " года" ;
стрРез = стрДень+ " " + стрМес+ " " + стрГод;
Возврат стрРез;
КонецФункции