gifts2017

ADODB: загрузка документов из 1С7.7 в 1С8.1. Получаем время документа

Опубликовал Alexei Zhovner (jan27) в раздел Программирование - Практика программирования

Для новичков!!!

_1SJOURN
DATE_TIME_IDDOC
«2009011385UHM8  EDMU»
как получить время?

Возможно, кто-то задался целью загружать документы из 1С7.7 в 1С 8.1  прямыми запросами. Тогда вы наверняка столкнетесь с тем, что в таблице _1SJOURN дата и время документа выглядит несколько странно.

То есть,  значение в поле «DATE_TIME_IDDOC» выглядит как, например, «2009011385UHM8  EDMU»

85UHM8 и есть так нужное нам время. Как же его привести к виду 1С8.1?

Лично мне понадобилось некоторое время, чтобы решить проблему.

Для начала, в прямом запросе разделим дату и время:

….

|SELECT    

|Convert(Char(8),_1SJOURN.DATE_TIME_IDDOC) as Date,

|Substring(_1SJOURN.DATE_TIME_IDDOC,9,6) as Time,

На широких просторах интернета мне удалось найти лишь такое решение:

Функция Конвертировать36_10(Рез36)

            Если СокрЛП(Рез36)="" тогда

                        Возврат "0";

            КонецЕсли;

            Arr36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

            Deci=0;

            Для j=1 по СтрДлина(СокрЛП(Рез36)) цикл

                                   Deci = Deci*36;

                                   Deci = Deci+Найти(Arr36,Сред(СокрЛП(Рез36),j,1))-1;

            КонецЦикла;

            Возврат Deci:

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

Но этого явно не достаточно для решений нашей проблемы…

Конечный вид функции после доработки:

Функция Конвертировать36_Стр(Рез36)

            Если СокрЛП(Рез36)="" тогда

                        Возврат "0";

            КонецЕсли;

            Arr36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

            Deci=0;

            Для j=1 по СтрДлина(СокрЛП(Рез36)) цикл

                                   Deci = Deci*36;

                                   Deci = Deci+Найти(Arr36,Сред(СокрЛП(Рез36),j,1))-1;

            КонецЦикла;

            Deci=Deci/10000;

            час = Цел(Deci/3600);

            ЧасСек = час*3600;

            Остаток = Deci-ЧасСек;

            мин = Цел(Остаток/60);

            минСек = мин*60;

            Остаток = Остаток-минСек;

            Сек = Остаток;

            Возврат Формат(Час,"ЧЦ=2;ЧВН=;ЧН=") + "" + Формат(Мин,"ЧЦ=2;ЧВН=;ЧН=") + ""+Формат(Сек,"ЧЦ=2;ЧВН=;ЧН=");

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

 

Вот теперь можем смело писать дату и время документа:

НовДок.Дата = Дата(""+Набор.Fields("Date").Value + Конвертировать36_Стр(Набор.Fields("Time").Value) );

 PS: Предназначено для бухгалтерских конфигураций)

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Артур Аюханов (artbear) 08.02.11 16:24
(0) У тебя функция Конвертировать36_10 выполняет совершенно другую роль :)
Дай ей другое наименование, иначе коряво смотрится и плохо для сопровождения - например, старая функция возвращает число, а у тебя возвращается строка :)
2. Alexei Zhovner (jan27) 08.02.11 16:34
(1) спасибо, это я пропустил )
3. Олег Веселов (sml) 10.02.11 09:20
Проще в Скуле прописать хранимую процедуру (в сети их навалом) и пользовать ее непосредственно в запросе
4. Екатерина (1513472) 11.02.11 09:18
Подскажите пожалуйста а как вообще можно из 77 в 82 данные скопировать чтоб не остатки и не справочники а сами сдеанные документы (Акты, счета, начисления з\п принятие ОС и многое другое)А то из данной статьи понятно что нужно алгоритм куда то прописать и к чему то добавить а я просто пользователь-бухгалтер
5. Alexei Zhovner (jan27) 14.02.11 05:26
6. Alexei Zhovner (jan27) 14.02.11 05:28
(3) согласен, так и пытался и сделать, но не являясь администратором...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа