1с dcf как открыть

Обновлено: 02.07.2024

1. Усовершенствован анализ сделанных обработкой изменений, теперь в отчет выводятся:

в) Регистры сведений

г) Регистры накопления

д) Регистры рассчетов

2. Добавлены настройки анализа. Есть 3 варианта анализа:

а) Принимать решение о принятии сделанных обработкой изменений

б) Сразу принимать изменения и выводить отчет о анализе

в) только проанализировать действия обработки (удобно при тестировании обработки. )

3. Появилась возможность отключить типовой контроль при записи объектов.

4. Добавлены алгоритмы. Процедуры используемые при выполнении обработки теперь можно выносить в отдельный алгоритм. Так же отработанные алгоритмы легко переносить в алгоритмы конфигурации "Конвертация данных 2.0"

5. В анализ добавлена колонка "Уникальный идентификатор", что дает возможность отката!

6. Исправлены ошибки.

Новое без версии:

1. Добавлены параметры(любого типа), которые можно использовать в обработчиках. (получить параметр можно функцией ПолучитьПараметр(<ИмяОбработки>))

2. Добавлен анализ сделанных обработкой изменений

ОПИСАНИЕ:

Изменена стандартная консоль отчетов. Довольно таки свежая, по этому требует релиз предприятия не ниже 8.1.11 (на сколько я помню)
В обработке добавлено 3 блока кода (в процедуру ПриОткрытии, описание переменных и блок с нужными процедурами) и форма (вызывается через "Обработки объектов отчета" > "Настройка обработки объектов" ) с помощью которой можно создавать/редактировать/удалять обработки (можно и несколько обработок написать на одну компоновку данных), выполнение которых потом можно вызвать сразу из меню "Обработки объектов отчета".
На форме настройки обработок отчета есть поле с деревом отчета в котором мы выбираем для какого отчета мы настраиваем обработки, "доступные поля": это поля доступные для использования в обработке. И панель с закладками: где закладки это и есть обработки и наконец в текстовом поле на закладке сам текст обработки
Типовая форма не изменена изменен только ее модуль.

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:


ПЛЮСЫ:

+ Обновление консоли на новый типовой релиз возможно двумя кликами мыши.
+ Для выборки используется вся мощь механизма СКД (системы компоновки данных), для тех кто не изучил еще, лично мой совет изучать. и отчеты будет легче писать
+ Результат выборки можно посмотреть перед применением обработки.
+ Обработки можно собирать в группы, например обработки для ЗУП которые хранить в одном файле .dcf, и Вы уже не порастеряете их, лично я терял постоянно. рассеяный я. а забыть где лежит весь сборник которым ты периодически пользуешься довольно таки сложно.
+ Код абсолютно открыт и доступен всем!

ПО РАЗВИТИЮ ПРОЕКТА:

Собираюсь доработать:
0. Куча мелких и не очень мелких исправлений и доработок.
1. Привинтить контекстные подсказки.
2. Сделать возможность перетаскивания из окна доступные поля.
3. Привинтить возможность сохранения/использования шаблонов кода например тот же код по перебору значений дерева
можно поместить в шаблон
3.1 Выгрузка шаблонов во внешний файл (например xml)
3.1.1 Создание единой базы шаблонов
4. Создание единых базы обработок для данной консоли, например:
5. Создание создания расписания запуска обработок как задач.

Для щедрых людей которым помогла обработка:
Яндекс деньги № 41001241519720 , не откажусь :)

Наверное многие, приобретающие часы или метеостанцию, видели на упаковке логотип Radio Controlled Clock или даже Atomic Clock. Это весьма удобно, ведь достаточно поставить часы на стол, и они через некоторое время автоматически настроятся на точное время.


Разберемся как это работает и напишем декодер на языке Python.

Существуют разные системы синхронизации времени. Наиболее популярная в Европе — немецкая система DCF-77, в Японии есть своя система JJY, в США есть система WWVB, и так далее. Далее рассказ будет о DCF77, как о наиболее актуальной и доступной для приема в некоторых местах европейской части России и соседних странах (у жителей Дальнего Востока может быть противоположное мнение, впрочем они в свою очередь могут принять и проанализировать японский сигнал;).

Все написанное далее, будет про DCF77.

Прием сигнала

DCF77 это длинноволновая станция, работающая на частоте 77.5КГц, и передающая сигналы в амплитудной модуляции. Станция мощностью 50КВт расположена в 25км от Франкфурта, она начала работу еще в 1959 году, в 1973 к точному времени была добавлена информация о дате. Длина волны при частоте 77КГц весьма большая, поэтому размеры антенного поля тоже весьма приличные (фото из Википедии):


При такой антенне и подводимой мощности, зона приема охватывает практически всю Европу, Белоруссию, Украину и часть России.



Там же нажимаем кнопку download и записываем фрагмент длиной в несколько минут. Разумеется, при наличии «настоящего» приемника, способного записать частоту 77.5КГц, можно использовать и его.

Конечно, принимая радиосигналы точного времени через Интернет, мы не получим действительно точное время — сигнал передается с задержкой. Но наша цель лишь понять структуру сигнала, для этого интернет-записи более чем достаточно. В реале конечно, используются специализированные устройства для приема и декодирования, о них будет сказано ниже.

Итак, мы получили запись, приступим к ее обработке.

Декодирование сигнала

Загрузим файл с помощью Python и посмотрим его структуру:

Мы видим типичную амплитудную модуляцию:


Для упрощения декодирования возьмем огибающую сигнала с помощью преобразования Гильберта:


Результат в увеличенном виде:


Сгладим выбросы от помех с помощью low-pass фильтра, заодно вычислим среднее значение, оно пригодится потом для парсинга.


Результат (желтая линия): практически прямоугольный сигнал, который довольно легко анализировать.


Парсинг

Сначала нужно получить битовую последовательность. Сама структура сигнала очень проста.


Импульсы поделены на секундные интервалы. Если расстояние между импульсами составляет 0.1с (т.е. длина самого импульса 0.9с), к битовой последовательности добавляем «0», если расстояние составляет 0.2с (т.е. длина 0.8с), добавляем «1». Конец каждой минуты обозначается «длинным» импульсом, длиной 2с, битовая последовательность при этом обнуляется, и заполнение начинается заново.

Вышенаписанное несложно записать на языке Python.


В результате получаем последовательность бит, в нашем примере для двух минут она выглядит так:

Кстати интересно, что в сигнале есть и «второй слой» данных. Последовательность бит также закодирована с помощью фазовой модуляции. Теоретически, это должно обеспечивать более устойчивое декодирование даже в случае ослабленного сигнала.

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


Биты описаны в Википедии, и они довольно любопытны. Первые 15 бит не используются, хотя были планы использовать для систем оповещения и гражданской обороны. Бит A1 указывает на то, что в следующий час часы будут переведены на летнее время. Бит А2 указывает, что в следующий час будет добавлена дополнительная секунда, которая иногда используется для коррекции времени в соответствии с вращением Земли. Остальные биты кодируют часы, минуты и дату.


Для тех, кто захочет поэкспериментировать самостоятельно, код для декодирования приведен под спойлером.

Запустив программу, мы увидим примерно такой вывод:

0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42

Собственно, вот и вся магия. Плюс такой системы в том, что декодирование чрезвычайно простое, и может быть сделано на любом, самом несложном микроконтроллере. Просто считаем длину импульсов, накапливаем 60 бит, и в конце каждой минуты получаем точное время. По сравнению с другими способами синхронизации времени (GPS например, или не дай бог, Интернет:), такая радиосинхронизация практически не требует электроэнергии — для примера, обычная домашняя метеостанция работает около года от 2х батареек АА. Поэтому с радиосинхронизацией делают даже наручные часы, не говоря уже конечно, о настенных или об уличных вокзальных.

Удобство и простота DCF привлекают и любителей самоделок. Всего за 10-20$ можно купить готовый модуль из антенны с готовым приемником и TTL-выходом, который можно подключить к Arduino или другому контроллеру.


Для Arduino уже написаны и готовые библиотеки. Впрочем, и так известно — что ни делай на микроконтроллере, получаются либо часы, либо метеостанция. С таким устройством получать точное время действительно несложно, если конечно находиться в зоне приема. Ну и можно повесить на часы надпись «Atomic Clock», и заодно объяснять всем желающим, что устройство действительно синхронизируется с помощью атомных часов.

Желающие могут даже проапгрейдить старые бабушкины часы, установив в них новый механизм с радиосинхронизацией:


Найти такой можно на ebay по ключевым словам «Radio Controlled Movement».

И наконец, лайфхак для тех, кто дочитал досюда. Даже если в ближайших паре тысяч км нет ни одного передатчика радиосигнала, такой сигнал несложно сгенерировать самостоятельно. В Google Play есть программа с названием «DCF77 Emulator», которая выводит сигнал на наушники. По заверениям автора, если обмотать провод наушников вокруг часов, они поймают сигнал (интересно как, ведь обычные наушники не выдадут сигнал 77КГц, но вероятно прием идет за счет гармоник). У меня на Android 9 программа не заработала совсем — просто не было звука (а может я его не слышал — 77КГц ведь:), но может кому-то повезет больше. Некоторые впрочем, делают себе и полноценный генератор сигналов DCF, который несложно сделать на той же Arduino или ESP32:

MdInternals понимает формат cf, cfu, epf, erf, распаковывает содержимое в удобочитаемые Xml и текстовые файлы и загружает обратно. Позволяет программно обращаться к внутренним файлам и свойствам объектов.

Проект состоит из частей:

  • MdInternals программно обращается к объектам и свойствам конфигурации
  • CfProject отвечает за сериализацию и десериализацию объектов MdInternals
  • MdInternals.Cil декомпилирует байт-код (OpCode) 1С
  • MdInternals.Serialization работает с внутренним полу-JSON форматом 1С вида " < 19 < "", 2 >>"

Выгрузка файлов cf, cfu, epf, erf на диск

Распознанные файлы записываются в дерево каталогов по видам объектов. Нераспознанные помещаются в каталог Unresolved:



Распознанные файлы выгружаются в XML-формате. Формат XML позволяет контролировать логическую целостность файлов и обрабатывать файлы сторонними программами. Известные свойства перемещаются в соответствующие разделы (атрибуты или тэги) XML-структуры:


Чтение из MSSQL-таблицы

Обращение к внутренним файлам

Создание файла из выгруженного xml-формата

Описание Cf-Формата

Cf-файл состоит из заголовка образа (ImageHeader) и следующими за ним страницами (ImagePage1-ImagePageN). Заголовок образа состоит из 4х байт сигнатуры, которая равна 0xFF 0xFF 0xFF 0x7F, 4х байт размера страницы и 8 зарезервированных байт. После заголовка файла идут по порядку страницы с данными. Каждая предыдущая страница ссылается на последующую.


Каждая страница (ImagePage) состоит из заголовка страницы (ImagePageHeader), группы указателей на записи ImageRowPointers и области ImageRows.


Заголовок страницы ImagePageHeader содержит в себе: зарезервированные 2 байта 0x0D 0x0A, 27 байт текстовой информации и еще зарезервированные 2 байта 0x0D 0x0A. Текстовая информация содержит 3 шестнадцатеричных числа: общий размер данных всех страниц (FullSize), размер текущей страницы (PageSize) и адрес следующей страницы в файле (NextPageAddress). FullSize проставляется только для первой страницы цепочки страниц. Для остальных страниц цепочки это значение 0. Для последней страницы цепочки NextPageAddress принимается равным 0xFF 0xFF 0xFF 0x7F.

Блок указателей ImageRowPointers занимает размер, указанный в значении PageSize страницы. Каждый указатель состоит из 4х байт адреса заголовка HeaderAddress и 4х байт адреса тела BodyAddress. В конце каждого указателя помещается сигнатура 0xFF 0xFF 0xFF 0x7F. Адреса указывают на расположения внутри текущей страницы на область ImageRows.

Заголовок ImageRowHeader начинается с блока заголовка страницы ImagePageHeader, который сообщает, сколько байт отведено под заголовок. Далее идут 20 зарезервированных байт, UTF-16 строка идентификатора данных (Id) и 4 зарезервированных байт.

Тело ImageRowBody начинается с блока заголовка страницы ImagePageHeader, который сообщает, сколько байт отведено под тело данных. Если тело данных начинается на 0xEF 0xBB 0xBF (сигнатура UTF8), то тело содержит UTF-8 строку. Иначе тело данных содержит упакованные данные. Если распакованные данные начинаются на 0xFF 0xFF 0xFF 0x7F, то содержимое – последовательность объектов, и они записаны в CF-формате. Иначе содержимое – это строка сериализации.

Читайте также: