Строка в дату. Универсальное решение. Применение NetObjetToIDispatch45

15.12.15

Разработка - Инструментарий разработчика

Нам часто приходится делать преобразования строк в даты. В 1С нет специальных средств на эту тему. Более того, я не встречал никаких универсальных решений в 1С, которыми был бы доволен и в очередной раз нам приходится писать костыли вроде этого: Дата(Сред(стрДата,7,4)+Сред(стрДата,4,2)+Лев(стрДата,2)). Конечно же, в microsoft уже давно решили эту задачу на своей платформе NET. Почему мы бы им не воспользоваться.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Универсальная_СтрокаВДату.zip
.zip 123,82Kb
9
9 Скачать (1 SM) Купить за 1 850 руб.

I. Как сделать самому подобное. 

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

Объемную статью Использование сборок .NET в 1с 7.x и 8.x по этому написал serginio. Я использую его наработки.

Вдохновившись знанием, что это реально, я начал поиски нужной функции.

Очень быстро гугл выдал DateTime.ParseExact.

Это статическая функция типа DateTime, которая проводит парсинг строки и возвращает дату. 

и примеры использования

Теперь о том, как это использовать в 1С.

1. Подключить ком-объект, позволяющий использовать функции NET 

БиблиотекаNET = новый COMОбъект("NetObjectToIDispatch45");

2. Создать тип DateTime

DateTime = БиблиотекаNET.ПолучитьТип("System.DateTime");

3. Вызвать функцию ParseExact

4. Параметры функции s и format примитивного типа, их можно передавать из 1С как есть

5. Параметры функции provider и style объектного типа. Их необходимо сначала создать.

6. Параметр style имеет тип DateTimeStyles. В описании пространство имен для него установлено System.Globalization.

Таким образом получить тип можно 

DataTimeStyles = БиблиотекаNET.ПолучитьТип("System.Globalization.DateTimeStyles");

DataTimeStyles  - перечисление и в описании определены его члены

Для того, чтобы передать параметр в функции, будем использовать член - DataTimeStyles.None

7.  Параметр provider имеет тип IFormatProvider.

Это интерфейс, его реализацию получили классы NumberFormatInfo, DateTimeFormatInfo и CultureInfo.

В примере вызова используется CultureInfo. Поступаем точно так же.

КлассCultureInfo = БиблиотекаNET.ПолучитьТип("System.Globalization.CultureInfo");
ОбъектCultureInfo = БиблиотекаNET.СоздатьОбъект(КлассCultureInfo, "ru-RU");

В итоге получаем

БиблиотекаNET = новый COMОбъект("NetObjectToIDispatch45");
DateTime = БиблиотекаNET.ПолучитьТип("System.DateTime");
КлассCultureInfo = БиблиотекаNET.ПолучитьТип("System.Globalization.CultureInfo");
ОбъектCultureInfo = БиблиотекаNET.СоздатьОбъект(КлассCultureInfo, "ru-Ru");
DataTimeStyles = БиблиотекаNET.ПолучитьТип("System.Globalization.DateTimeStyles");
Дата = DateTime.ParseExact
                    (
                    "10 февраля 1978",
                    "dd MMMM yyyy",
                    ОбъектCultureInfo,
                    DataTimeStyles.None
                    );

Для каждого региона есть стандартные шаблоны записи дат. Их можно посмотреть программой CultureInfoExplorer

Например, стандартные шаблоны дат для русского языка

Региональные настройки для русского языка

 

В обработке вместо рассмотренной функции используется TryParseExact и учитывается вариант без указания формата, а указания только региона.В этом случае произойдет перебор всех стандартных шаблонов описания дат для региона со скриншота от d до y. 

Результат после нажатия на кнопку "Пуск":

Конвертация строки в дату

 II. Как установить и начать пользоваться. 

1. Установить NET Framework 4.5 https://www.microsoft.com/ru-ru/download/details.aspx?id=30653
2. Регистрация NetObjetToIDispatch45.dll
2.1 Запустить РегистрацияКомСервера.exe
2.2 Нажать кнопку "Регистрация Сервера"
2.3 Выбрать файл NetObjetToIDispatch45.dll, после чего сгенерится строка вызова, необходимая для регистрации
2.4 Запустить командную строку от имени Администратора.
2.5 Скопировать строку вызова из формы в командную строку и запустить.
2.6 Убедиться, что результатом запуска стало "Типы зарегистрированы успешно"
3. Запустить обработку Универсальная_СтрокаВДату.epf
3.1 По нажатию кнопки "Пуск" все строки должны сконвертироваться в даты.

Универсальные строкавдату СтрокаВДату ParseExact TryParseExact NET в 1с

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    170254    940    403    

907

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    13248    100    46    

104

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    26826    90    48    

134

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    16974    41    15    

75

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    190769    1151    0    

918

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    11504    40    27    

66

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    954    2    0    

5

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    104013    244    100    

306
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. olbu 16.12.15 10:07 Сейчас в теме
Интересная статья. У меня возник вопрос, есть ли методы обойти "2. Регистрация NetObjetToIDispatch45.dll", те зарегистрировать dll не имея административных прав? У большинства пользователей нет административных прав...
Если это можно как то обойти, то можно использовать в работе.
2. invertercant 22 16.12.15 10:12 Сейчас в теме
(1) olbu, Устанавливать это на каждой клиентской машине было бы странно. Лучше поставить на сервер и все функции использующие com объект, сделать серверными. На сервере права администратора все равно потребуются, но сделать это надо будет всего один раз.
3. Serginio 941 16.12.15 16:44 Сейчас в теме
В функции СоздатьОбъект можно передавать как строку так и тип. Например
КлассCultureInfo = БиблиотекаNET.ПолучитьТип("System.Globalization.CultureInfo");
ОбъектCultureInfo = БиблиотекаNET.СоздатьОбъект(КлассCultureInfo, "ru-Ru");

можно заменить одной строкой

ОбъектCultureInfo = БиблиотекаNET.СоздатьОбъект("System.Globalization.CultureInfo", "ru-Ru");

Вот описание функции

Type ТипДляСоздатьОбъект(object ТипOrig)
        {
            object Тип = ТипOrig;
            string ТипСтр = Тип.ToString();
            if (Тип is AutoWrap)
            { Тип = ((AutoWrap)Тип).O; }
            else if (Тип.GetType() == typeof(String))
            {

                Тип = НайтиТип((string)Тип);

                if (Тип == null)
                {
                    string ошибка = " неверный тип " + ТипСтр;
                    MessageBox.Show(ошибка);
                    throw new  COMException(ошибка);
                }
            }
            return (Type)Тип;
        }


public object СоздатьОбъект(object Тип, params object[] argOrig)
        {
            //   MessageBox.Show(Тип.ToString() + " параметров=" + args.Length.ToString());

            var res = ТипДляСоздатьОбъект(Тип);

            object[] args = AutoWrap.ПолучитьМассивРеальныхОбъектов(argOrig);
            return AutoWrap.ОбернутьОбъект(System.Activator.CreateInstance(res, args));

        }
Показать

Кстати нужно мне изменить с проверкой на ВыводитьСообщениеОбОшибке
4. gubanoff 63 17.12.15 09:15 Сейчас в теме
(0) Все супер, но внешние компоненты, определенные версии Net и тому подобное очень затруднительно использовать более, чем у одного клиента. Всегда возникают проблемы с совместимостью, что-то не установлено, что-то не той версии и т.п. Поэтому я бы взял все варианты дат для своего языка и обработал бы их в коде 1С. Плюс какие-то некорректные случаи. Но для общего развития полезный материал, спасибо.
5. Serginio 941 17.12.15 10:11 Сейчас в теме
(4) Во первых можно делать все на сервере. Во вторых какие проблемы с версиями и совместимостью? Если хочешь полную совместимость, то есть NetObjetToIDispatch для 2.0 используй её. А так с Win 7 обновление .Net framework

кстати актуальная версия 4.6.1

И зачем заного изобретать велосипед, когда все придумано давно
invertercant; +1 Ответить
6. gubanoff 63 17.12.15 11:57 Сейчас в теме
(5) Serginio, у каких-то клиентов Win XP, у каких-то Win 7, у каких-то и Linux может быть и еще много чего интересного.
7. Serginio 941 17.12.15 13:09 Сейчас в теме
Еще раз для Win XP есть NetObjetToIDispatch для 2.0 Ну а насчет Linux, то они ССЗБ.
8. Serginio 941 17.12.15 13:15 Сейчас в теме
И еще добавлю используя классы .Net для расширения возможностей 1С
1. Экономия времени, а значит и денег
2. Увеличение производительности
3. Замена ВК. Нужно умет программировать на 1С и знать классы .Net
9. Serginio 941 17.12.15 15:56 Сейчас в теме
(0) Может пример использования с Regex сделаешь? Уж больно у тебя все красиво
10. invertercant 22 18.12.15 14:28 Сейчас в теме
(9) Serginio, Пусть лучше на эту тему знающий человек пишет. /(?:(?:\s*[+>~,]\s*|\s+)|[^:+>~,\s\\[\]]+(?:\\.[^:+>~,\s\\[\]]*)*)|\[(?:[^\\[\]]*(?:\\.[^\\[\]]*)*|[^=]+=~?\s*(?:"[^\\"]*(?:\\.[^"\\]*)*"|'[^\\']*(?:\\.[^'\\]*)*'))\]|:[^\\:([]+(?:\\.[^\\:([]*)*(?:\((?:[^\\()]*(?:\\.[^\\()]*)*|"[^\\"]*(?:\\.[^"\\]*)*"|'[^\\']*(?:\\.[^'\\]*)*')\))?/g Я к такому не готов. пока.
Оставьте свое сообщение