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

28.11.17

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

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

Файлы

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

Наименование Скачано Купить файл
Работа с кодами - числами ,датами, кодами справочников, номерами документов, идентификаторами в 1С и в других базах данных.:
.epf 26,75Kb
3 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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



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

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

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

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

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

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4220    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7834    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    53289    dimanich70    84    

174

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

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7712    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67792    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9673    ke.92@mail.ru    17    

68
Для отправки сообщения требуется регистрация/авторизация