Работа с кодами - числами, датами, кодами справочников, номерами документов, идентификаторами в 1С и в других базах данных

Публикация № 707278

Разработка - Универсальные функции

Поддерживается преобразование Кодов на основе Алфавитов, в том числе ''блочных" кодов - состоящих из блоков (подстрок) одинаковой длины (например: 8, 16, 32-битные коды, Хэши и т.п.). Функции доступны на Клиенте и на Сервере. Демо-примеры сделаны на управляемых формах. Тестировалось на платформах серии 8.3.10.

Первоначально стояла задача взаимно-однозначного соответствия (синхронизации ) областей кодов некоторых справочников, номеров документов 1С с идентификаторами таблиц сторонней Базы Данных. Примененный подход показался  интересным и получил дальнейшее развитие  - это  методы работы с Алфавитами, "блочные"  коды с расчетом  длин блоков,  использование Алфавитов-коллекций с кодами символов. Последние могут пригодиться например  при передаче Клиент-Сервер  "непередаваемых" символов Алфавита.

1. Изменение кода,  добавление числа

Это наиболее востребованная операция : к входному числовому или строковому Коду на основе входного Алфавита добавляется Число , полученное преобразуется в выходной Код на основе выходного Алфавита. Реализовано  функцией:

Функция Код_Изменить(Код,Алфавит,ДобавитьЧисло,АлфавитИлиТипВых,РазмерВых)
//
//Возвращает Код в виде Числа,Даты или Строки (в зависимости от параметра АлфавитИлиТипВых).
//
//ВХОД
//     Код                  -  Число, Дата  или строковый входной Код на основе Алфавита;
//     Алфавит              =(перечислены возможные значения):
//                          - Строка уникальных символов  (не менее двух), на основе которых был создан строковый входной Код; если "" - все Уникоды.
//                          - СписокЗначений Кодов символов, на основе которых создан входной Код.
//                          - Массив Кодов символов, на основе которых создан входной Код.
//                          Не используется, если Код является Числом или Датой.
//      ДобавитьЧисло       - целое положительное или отрицательное число; иначе  0.
//      АлфавитИлиТипВыхода =(перечислены возможные значения):
//                          - Тип("Число") или любое Число (интерпритируется как Тип("Число"));                                                     
//                          - Тип("Дата") или любая Дата (интерпритируется как Тип("Дата"));
//                          - Алфавит-строка уникальных символов (не менее двух), на основе которых создается возвращаемый код; если "" - все Уникоды.
//                          - Алфавит-СписокЗначений Кодов символов, на основе которых создается выходной Код
//                          - Алфавит-Массив Кодов символов, на основе которых создается выходной Код.
//                          В других случаях (например, Неопределено) - наследуются входные параметры.
//      РазмерВых           - Количество символов в выходном коде. Недостающие ("нулевые") символы добавляются слева, в качестве "нулевого" 
//                            символа берется первый символ выходного Алфавита.
//                            Не используется для  "не алфавитных" выходных Кодов.
   

Если Код является Числом, производиться суммирование с ДобавитьЧисло, на основе АлфавитИлиТипВыхода  производиться преобразование в  выходной Код. Если добавляемое число равно 0, тогда это просто преобразования Кода из одного Алфавита в другой (например из "десятичного"  в "двоичный", из "русского" в "латиницу"  и т.п.).    

2. Методы Алфавитов

При работе со сторонними БД  (да и с 1С), часто неизвестен Алфавит, на основе которого построены коды той или иной таблицы (таблиц). Здесь может помочь следующая функция:

Код_Алфавит(Метод,Алфавит,Строки,ИсключаемыеСимволы,ДопИзменение,ТипВыхода)
//
//Возвращает Алфавит - Строку символов, СписокЗначений кодов символов или Массив кодов символов.
//
//ВХОД
//   Метод = "+" или "Сумма" - Добавляем к Алфавиту все отсутствующие в нем символы из строк параметра "Строки" ; 
//           "-" или "Разность" - Убираем из Алфавита все символы, присутствующие в строках параметра "Строки";
//           "=" или "Пересечение" - Получаем Строку из символов, присутствующих и в Алфавите и в строках параметра "Строки"
//           "#" или "Неповторение" - Получаем Строку из неповторяющихся символов  Алфавита и строк из параметра "Строки" ;  
//   Алфавит         - строка из неповторяющихся (уникальных) символов (отсортированность не обязательна,может быть пустым);
//   Строки          - строка или массив строк из любых символов;
//   ИсключаемыеСимв - строка из символов, которые запрещено использовать в алфавите;
//   ДопИзменение    = (перечислены возможные значения):-   
//                   - "Возр" - сортировать полученный Алфавит по возрастанию кодов Символов;
//                   - "Убыв" - сортировать полученный Алфавит по убыванию кодов символов;
//                   - "Инв"  - инвертирование полученного Алфавита (переписать справа- налево) 
//                   - [целое число] - код для ГСЧ ("случайная" перестановка символов полученного Алфавита.
//    ТипВыхода      - "Строка" или "СписокЗначений" или "Массив" (умолчание - "Строка"). 



Так, "пролистав"  нужную таблицу  (или таблицы) и собрав Коды в массив Строки, создаем Алфавит для данной таблицы (таблиц):

Алфавит= Код_Алфавит("+","",Строки,,"Возр").

 Можно применять эту функцию и на каждом шаге сканирования :

Алфавит= Код_Алфавит("+",Алфавит,Код); 

 а затем отсортировать:

Алфавит= Код_Алфавит(,Алфавит,,,"Возр");

3. "Блочные" Коды. Изменение, добавление числа.

В некоторых случаях Код-строка состоит  из одинаковых блоков определенной длины (подстрок). Так, например, построены битные строки при 8, 16 или 32 битном кодировании,  Хэши и т.п.   Для преобразования таких строк  предназначена функция:

Код_БлочныйИзменить(Код,Алфавит,ДлинаБлока,ДобавитьЧисло,АлфавитВых,ДлинаБлокаВых,ТипВыхода,Проверять,Ошибка)
//
//Функция возвращает выходной  "блочный"  Код  в зависимости от параметра ТипВыхода:
//  - или в виде Строки из соединенных подстрок  одинаковой длины (блоков)
//  - или в виде Массива подстрок одинаковой длины (блоков)
//  - или в виде Списка Значений подстрок одинаковой длины (блоков)
//  Работает со строковыми  "целыми" (не "дробными") Кодами на основе строковых Алфавитов.
//
//ВХОД
//  Код           - (входной) - строка символов  принадлежащих Алфавиту;
//  Алфавит       - строка уникальных символов  (не менее двух), на основе которых был создан входной Код 
//                  (если пустая строка  - подразумеваются все Уникоды). 
//  ДлинаБлока    - количество символов во входном  коде, рассматриваемых как единое целое (блок, подстрока).
//  ДобавитьЧисло - Добавляемое к Коду целое положительное или отрицательное число (в других случаях - 0).
//  АлфавитВых    - строка уникальных символов  (не менее двух), на основе которых будет создан выходной Код;
//                  (если пустая строка - подразумеваются все Уникоды).
//  ДлинаБлокаВых - количество символов в выходном коде, рассматриваемых как единое целое (блок,подстрока).   
//  ТипВыхода     - "Строка" или "Массив" или "СписокЗначений"  с  блоками
//  Проверять     - Если Истина - проверяются (и пересчитываются, если нужно) длины блоков    
//                  входа и выхода  (используется функция Код_ РазмерБлоков(...)).   
//
// ВЫХОД
//  Ошибка        - описание ошибки или пустая строка.



4. Проверка и расчет длин блоков

Для расчета  возможных длин блоков  в блочных Кодах предназначена функция:

Код_РазмерБлоков(РазмерАлфавита,ДлинаБлока,РазмерАлфавитаВых,ДлинаБлокаВых,РасчДлинаБлока,РасчДлинаБлокаВых)
//
//Возвращает пустую строку  или, в случае ошибки - строку с описанием ошибки.
//Внимание:  в случае ошибки все равно производиться расчет  "минимальных" значений длин входного и выходного блоков!
//
//ВХОД
//  РазмерАлфавита    - размер входного Алфавита;
//  ДлинаБлока        - количество символов во входном коде, рассматриваемых как единое целое  (блок,подстрока)
//  РазмерАлфавитаВых - размер выходного Алфавита;
//  ДлинаБлокаВых     - количество символов в выходном коде, рассматриваемых как единое целое  (блок,подстрока)       
//
//ВЫХОД
//  РасчДлинаБлока    - расчитанная длина входного  Блока
//  РасчДлинаБлокаВых - расчитанная длина выходного Блока

Данная функция используется для проверки-расчета длин блоков в функции  Код_БлочныйИзменить(...). Однако она может использоваться и самостоятельно, например для расчета минимальной длины получаемого кода при перекодировке из одного Алфавита в другой функцией  Код_Изменить(...). Вот так  получаем расчетную длину выходного кода:

РасчетнаяДлинаВыходногоКода=0;
Код_РазмерБлоков(РазмерВходногоАлфавита,ДлинаВходногоКода,РазмерВыходногоАлфавита,,,РасчетнаяДлинаВыходногКода);

 

Скачать файлы

Наименование Файл Версия Размер
Работа с кодами - числами ,датами, кодами справочников, номерами документов, идентификаторами в 1С и в других базах данных.:

.epf 26,75Kb
27.11.17
3
.epf 26,75Kb 3 Скачать

Специальные предложения

Оставьте свое сообщение

См. также

Программное создание динамического списка на управляемой форме. (Динамическое создание динамического списка). Готовая процедура + обработка - демонстрационный пример Промо

Практика программирования Универсальные функции v8::УФ 1cv8.cf Абонемент ($m)

Если у вас возникает необходимость на форму влиять динамически и создавать элементы управляемой формы программно, а особенно хотите вывести программно (динамически) динамический список, вам будет интересна эта процедура. Процедура включает также возможность формирования своей командной панели (а-ля снятие галочки "Автозаполнение" у стандартной командной панели списка).

1 стартмани

19.01.2018    57968    rpgshnik    29    

Библиотека программного изменения формы (УФ)

Инструментарий разработчика Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

07.08.2020    4139    BuriyLesha    17    

Сохранение настроек колонок

Практика программирования Работа с интерфейсом Универсальные функции v8 Абонемент ($m)

Сохранение настроек колонок табличных полей. Получение имени формы из модуля формы. Для обычных форм.

1 стартмани

10.07.2020    982    Arc    1    

Универсальные функции: разложение произвольной строки адреса в структуру

Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Процедуры и функции раскладывают произвольную строку адрес в структуру по ключевым словам.

1 стартмани

30.12.2019    3715    vik070777    10    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Абонемент ($m)

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

26.05.2017    49079    DarkAn    86    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

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

07.10.2019    30121    HostHost    40    

Работа с графической схемой в объектной модели DOM

Универсальные функции v8 v8::УФ Абонемент ($m)

Пример кода для работы с графической схемой в объектной модели DOM, платформа 8.3.12.

1 стартмани

04.06.2019    7968    botokash    19    

Корректировка движений документа

Универсальные функции v8 1cv8.cf Абонемент ($m)

Корректировка движений документа после его проведения по типовому алгоритму.

1 стартмани

26.05.2019    4642    rutadmeen    0    

Ускорение для Клиент-Банка Промо

Банковские операции Обмен с банком Универсальные функции Банковские операции v8 1cv8.cf Абонемент ($m)

У вас много платежей и клиент-банк долго их читает? Есть проверенная практикой идея, как это ускорить.

1 стартмани

08.10.2012    23732    Yashazz    15    

Программное формирование картинки в 1С:Предприятие 8.3.9 (ПотокВПамяти / ЗаписьДанных)

Универсальные функции v8 1cv8.cf Абонемент ($m)

В статье представлен код программного формирования картинки (двоичные данные) без всяких внешних компонент, без формирования строки Base64, используя лишь встроенные механизмы 1С предприятие 8.3.9 (объекты ПотокВПамяти и ЗаписьДанных). Сам по себе код формирования картинки не несёт ничего нового. Всё описано в википедии. Захотелось попробовать новые методы, но никак не доходитили руки. В приложении обработка практически с этим же кодом.

1 стартмани

16.05.2019    9317    yku    7    

Альтернатива внешним печатным формам. ЗУП 3.1

Печатные формы документов Универсальные функции Зарплата Практика программирования Зарплата Разработка v8 v8::СПР ЗУП3.x Абонемент ($m)

Как в ЗУП 3.1.8 отказаться от внешних печатных форм и расширением увеличить количество полей, доступных при редактировании макетов, для изменения печатных форм Т1, Т5, Т8 и аналогичные пользователями.

1 стартмани

30.01.2019    14446    Mogilnikova    3    

Использование подсистемы БСП "Заполнение объектов"

Практика программирования Универсальные функции БСП (Библиотека стандартных подсистем) v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

23.11.2018    25581    ids79    23    

Сохранение реквизитов и табличных частей объектов в XML Промо

Обмен через XML Универсальные функции v8 1cv8.cf Абонемент ($m)

Пример того, как можно сохранять и загружать объекты 1С методами встроенных объектов ЗаписьXML и ЧтениеXML.

1 стартмани

25.11.2011    21812    saiten    21    

Доработка функции ОбщегоНазначения.ЗаменитьСсылки для автоматической чистки или свёртки табличных частей

Универсальные функции v8 Абонемент ($m)

Стандартная обработка по замене дублей ругается на документ с неуникальными строками. Предполагается, что их нужно либо а) удалить, либо б) свернуть. Я немного модифицировал код функции ОбщегоНазначения.ЗаменитьСсылки, встроив в него вызов процедуры, переопределяемой в модуле менеджера соответствующего документа. И в этом модуле менеджера мы уже сами определяем - удалить или свернуть. Ну и вообще там чего хошь можно с этой коллекцией сделать - сам же ж процедуру пишешь...

1 стартмани

12.09.2018    4115    albert.goncharov    0    

Пропорциональное распределение в запросе

Универсальные функции Практика программирования v8 1cv8.cf Абонемент ($m)

Периодически в работе сталкиваюсь с задачей пропорционального распределения сумм в запросе. Ситуация усложняется, когда распределяемые суммы изначально не известны и определяются в процессе выполнения запроса. Эта статья один из примеров решения такой задачи.

1 стартмани

28.06.2018    11903    invertex    7    

Заполнение справочника с изображениями элементами по умолчанию

Практика программирования Обмен через XML Универсальные функции v8 Абонемент ($m)

Пример одного из решений, как можно заполнить справочник с изображениями значениями по умолчанию включая сами изображения. Сами изображения взяты из программы MapSource 6.16.3. Данные для загрузки хранятся в макете в формате XML.

1 стартмани

26.03.2018    8663    Kim1C    0    

Проверка таблицы на дублирование строк (ТаблицаЗначений, ТабличнаяЧасть) и получение массива таких строк

Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Функция для проверки дублирования строк в ТаблицеЗначений или ТабличнойЧасти. Также, если необходимо, возвращает массив задублированных строк (можно обработать).

1 стартмани

05.02.2018    11305    uri1978    27    

Размеры управляемой формы

Практика программирования Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

08.10.2017    26846    json    9    

Пример универсальной функции для создания схемы компоновки данных

Практика программирования Универсальные функции v8::СКД 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

12.01.2017    32206    dbachinsky    32    

Функция преобразования промежутка времени в строку

Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

Функция предназначена для преобразования промежутка времени в строку с разбивкой по годам, дням, часам, минутам, секундам.

1 стартмани

23.09.2016    10079    vovant    1    

1С 8.2 переключение раскладки клавиатуры (с помощью dynwrap.dll)

Разработка внешних компонент Универсальные функции v8 Абонемент ($m)

Функция для автоматического переключения раскладки клавиатуры. (с помощью dynwrap.dll) Дабы не переключать каждый раз (при вводе информации в разных полях) с "Rus" на "Eng", можно эту работу возложить на функцию.

1 стартмани

22.05.2013    15202    Serg23ru    24    

Конвертер Даты из числового формата Excel

Загрузка и выгрузка в Excel Универсальные функции v8 1cv8.cf Абонемент ($m)

Столкнувшись с проблемой загрузки в 1С из Excel Даты-Времени в числовом формате к удивлению не нашел нигде подобных формул. Может потому что они уж слишком банальны, а может потому что они "тайное знание посвященных". В общем, эта обработка пример конвертации Excel <=> 1C

1 стартмани

17.04.2013    18411    vova196    5    

Точка Актуальности для 1С 8

Практика программирования Универсальные функции v8 УТ10 Абонемент ($m)

Все знают, что такое ТА для 1с 7.7 И этот механизм отсутствует в 1С 8. Но многие бухгалтера привыкли к нему. Почему бы тогда его не реализовать?

1 стартмани

18.12.2012    20598    Sykoku    28    

Ограничение на проведение реализаций по группе доступности складов в УТ 10.3

Практика программирования Универсальные функции Учет ТМЦ Учет ТМЦ v8 УТ10 Абонемент ($m)

В стандартной конфигурации УТ 10.3, настройка "группы доступности складов" не накладывает ограничения на продажи с определённых складов. Группа доступности складов позволяет наложить ограничение лишь на автоматическое размещение товаров в заказе покупателей, т.е. менеджер может вручную выбрать размещение и совершить продажу. Данная доработка исправляет эту ситуацию.

12.04.2012    12235    pusix    8    

Синхронизация с сервером 1С во внешнем соединении

Внешние источники данных Универсальные функции v8 1cv8.cf Абонемент ($m)

Позволяет установить время удаленного SQL-сервера на компьютере при выполнении обмена через Внешнее соединение

1 стартмани

27.09.2011    13397    sml    6    

Как превратить линейно-периодический отчёт в многолинейно-периодический (в платформах 8.х)

Универсальные функции Анализ учета v8 1cv8.cf Абонемент ($m)

Навеяно http://infostart.ru/public/90001/ - решение на основе пользовательских полей в СКД

1 стартмани

27.09.2011    17105    e.kogan    35