Рубрика «справочники»

Бумажные книги по программированию — удобный инструмент или пережиток прошлого? - 1

Нашёл у себя в ящике стола один очень старый каталог книг Microsoft Press за 1988–89 годы. Мне нравится иногда его доставать, перечитывать описания компьютерных книг тех лет, разглядывать их обложки. Да просто сами посмотрите на названия некоторых книжек из этого проспекта:

Собрали всем «Хабром» справочник «Кем выдан…» для паспортов. Качайте на здоровье - 1

С пару месяцев назад мы поэкспериментировали: получится ли на «Хабре» собрать справочник подразделений, выдающих российские паспорта. Дело полезное: эти данные нужны много кому, канонического источника нет, а существующие — очень так себе.

И знаете, все получилось. Пригодный к использованию справочник готов, можно качать и пользоваться. А еще мы сделали подсказки, которые ускоряют ввод подразделений в формы.
Читать полностью »

Оглавление

Основные принципы работы
Справочники и связанные с ними объекты
Перечисление «Типы номенклатуры»
Справочник «Виды номенклатуры»
Справочник «Товарные категории»
Справочник «Товарные характеристики»
Дополнительные реквизиты и сведения
Функционал «Номенклатура, продаваемая совместно»
Справочник «Производители»
Справочник «Номенклатура поставщиков»
Справочник «Ценовые группы»
Справочник «Сезонные группы номенклатуры»
Справочник «Политики учёта серий»
Справочник «Группы доступа номенклатуры»
Резюме

Принципы системного подхода к проектированию справочников номенклатуры в 1С Управление Предприятием 2 (ERP 2.4.6) или как избежать замусоривания.

В 1С Управление предприятием 2 используется целое семейство справочников для работы с номенклатурой. Эти справочники являются частью НСИ. Правильно организованный подход к НСИ гарантирует контроль работы конфигурации и пользователей. Поэтому работа с НСИ требует жёсткого и, самое главное, систематического подхода, в противном случае, справочники мгновенно превращаются в заполненные мусором списки. Кроме того, правильно организованные справочники упрощают работу с составлением запросов и выборок. Помимо этого, систематически организованные и заполняемые справочники позволяют применять математический аппарат для работы с ними (в основном аппарат из теории графов). И, независимо от этого, правильно организованные справочники позволяют вести корректную кодировку товаров.

Какие же принципы позволяют организовать систематическую работу со справочниками в 1С ERP?
Читать полностью »

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

Местоположение — это важно.
Как вычислить (город пользователя) по IP - 1
Читать полностью »

DevDocs: вся документация разработчика в одном месте, с быстрым и удобным интерфейсом

Сайт devdocs.io — проект французского программиста Тибо Курубля. Здесь собрана и упорядочена документация по наиболее популярным веб-технологиям, фреймворкам и API, и многим другим средствам разработки. DOM, HTML, JavaScript, jQuery, Node.js, PHP, Ruby, Python, Git, Angular, Backbone, CoffeScript, Less, Sass, Redis и много чего ещё… Всё оформлено в едином стиле, по всей базе документации работает поиск, в том числе нечёткий. Есть возможность выбрать только необходимые технологии, по которым надо искать. Вообще, интерфейс DevDocs радует — ничего лишнего, всё очень понятно и функционально, доступно множество клавиатурных сокращений.
Читать полностью »

Картинка для привлечения внимания демонстрирующая пример предстоящей «вложенности» камеры с парашютом в ранец.
БД. Справочники. Глобалы. Вложенные структуры. Живые примеры
Часть 1
Часть 2
Часть 3

В прошлый раз мы остановились на том, что у нас есть метод create(), который на основании глобала правил ^RuleDictionary создаёт элементы справочника. Нами был разобран пример создания элементов простейшего, одноуровневого справочника. Сегодня, рассмотрим каким образом, с помощью наших глобалов и методов, можно создавать вложенные структуры.

В коде программы, были использованы «прозрачные» переменные t и map, которые явно не передаются в методы, но доступны внутри них. Мне подсказали, что это не самый лучший способ демонстрации работы, особенно учитывая то, что для большинства, синтаксис Caché Object Script — нов. Поэтому, перед тем как приступить к вложенным структурам, внесём некоторые изменения в программу.


Читать полностью »

БД. Справочники. Живые примеры на глобалах 3
Часть 1
Часть 2

Слово «Живые», в названии статьи, означает, что механизмы, код и данные, из этих статей, используются в рабочем проекте.

Возможно, вам будет интересно посмотреть на некоторые варианты решений разработки БД (структур, механизмов).

На картинке изображён кусок кода, описывающего глобал правил справочника.

CRUD методы, в процессе своей работы, постоянно обращаются к этим правилам чтобы узнать, какие именно действия необходимо выполнить.

Ранее, мы остановились на том, что у нас есть следующие глобалы:

Посмотреть глобалы

^Dictionary("Vehicle","TransmissionType",1,0,"UpdateTime")="62086,66625"
^Dictionary("Vehicle","TransmissionType",1,0,"uid")=888
^Dictionary("Vehicle","TransmissionType",2,0,"UpdateTime")="62086,66625"
^Dictionary("Vehicle","TransmissionType",2,0,"uid")=888

^NameDictionaryElement(1,"partUri",0)="akp"
^NameDictionaryElement(1,"partUri",0,"UpdateTime")="62086,66625"
^NameDictionaryElement(1,"ru",0)="АКП"
^NameDictionaryElement(1,"ru",0,"UpdateTime")="62086,66625"
^NameDictionaryElement(2,"partUri",0)="meh"
^NameDictionaryElement(2,"partUri",0,"UpdateTime")="62086,66625"
^NameDictionaryElement(2,"ru",0)="МЕХ"
^NameDictionaryElement(2,"ru",0,"UpdateTime")="62086,66625"

^IndexDictionary("Vehicle","TransmissionType","name","partUri","akp",1)=1
^IndexDictionary("Vehicle","TransmissionType","name","partUri","meh",2)=1
^IndexDictionary("Vehicle","TransmissionType","name","ru","акп",1)=1
^IndexDictionary("Vehicle","TransmissionType","name","ru","мех",2)=1
^IndexDictionary("Vehicle","TransmissionType","uid",888,1)=1
^IndexDictionary("Vehicle","TransmissionType","uid",888,2)=1

^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""akp"",1)")=1
^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"",""акп"",1)")=1
^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,1)")=1
^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""meh"",2)")=1
^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"",""мех"",2)")=1
^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,2)")=1

Создать глобалы Ctrl+С/V

set ^Dictionary("Vehicle","TransmissionType",1,0,"UpdateTime")="62086,66625"
set ^Dictionary("Vehicle","TransmissionType",1,0,"uid")=888
set ^Dictionary("Vehicle","TransmissionType",2,0,"UpdateTime")="62086,66625"
set ^Dictionary("Vehicle","TransmissionType",2,0,"uid")=888
set ^NameDictionaryElement(1,"partUri",0)="akp"
set ^NameDictionaryElement(1,"partUri",0,"UpdateTime")="62086,66625"
set ^NameDictionaryElement(1,"ru",0)="АКП"
set ^NameDictionaryElement(1,"ru",0,"UpdateTime")="62086,66625"
set ^NameDictionaryElement(2,"partUri",0)="meh"
set ^NameDictionaryElement(2,"partUri",0,"UpdateTime")="62086,66625"
set ^NameDictionaryElement(2,"ru",0)="МЕХ"
set ^NameDictionaryElement(2,"ru",0,"UpdateTime")="62086,66625"
set ^IndexDictionary("Vehicle","TransmissionType","name","partUri","akp",1)=1
set ^IndexDictionary("Vehicle","TransmissionType","name","partUri","meh",2)=1
set ^IndexDictionary("Vehicle","TransmissionType","name","ru","акп",1)=1
set ^IndexDictionary("Vehicle","TransmissionType","name","ru","мех",2)=1
set ^IndexDictionary("Vehicle","TransmissionType","uid",888,1)=1
set ^IndexDictionary("Vehicle","TransmissionType","uid",888,2)=1
set ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""akp"",1)")=1
set ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"",""акп"",1)")=1
set ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,1)")=1
set ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""meh"",2)")=1
set ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"",""мех"",2)")=1
set ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,2)")=1

Читать полностью »

В прошлой статье мы рассмотрели пример справочника на MUMPS (Caché Object Script). Были разобраны структуры глобалов и метод retrieve. Мы научились простейшей операции — получению имени элемента по известному идентификатору. Рассматриваемые структуры были одноуровневыми. Опросы и комментарии, после статьи, показали, что тема в целом интересна. Сегодня рассмотрим примеры построения индексов для справочников. Все коды/идентификаторы/имена глобалов — настоящие. Основная идея данных статей — обмен знаниями/опытом разработки и проектирования живых баз данных.

Вкратце напомню основные моменты первой части:

  • cправочник это медленно меняющаяся информация;
  • retrieve — быстрая операция;
  • название элемента справочника меняется в одном месте;
  • Глобал имеет вид: ^ГлобальнаяПеременная(«индекс1»,«индекс2»,...,«индексN»)=«значение»

По просьбе 4dmonster в примерах будут публиковаться полные версии команд. (wrtie вместо w и т.д.)

Освежим в памяти имеющиеся глобалы с данными:

^Dictionary("Vehicle","TransmissionType",1,0,"UpdateTime")="62086,66625"
^Dictionary("Vehicle","TransmissionType",1,0,"uid")=888
^Dictionary("Vehicle","TransmissionType",2,0,"UpdateTime")="62086,66625"
^Dictionary("Vehicle","TransmissionType",2,0,"uid")=888

^NameDictionaryElement(1,"partUri",0)="akp"
^NameDictionaryElement(1,"partUri",0,"UpdateTime")="62086,66625"
^NameDictionaryElement(1,"ru",0)="АКП"
^NameDictionaryElement(1,"ru",0,"UpdateTime")="62086,66625"
^NameDictionaryElement(2,"partUri",0)="meh"
^NameDictionaryElement(2,"partUri",0,"UpdateTime")="62086,66625"
^NameDictionaryElement(2,"ru",0)="МЕХ"
^NameDictionaryElement(2,"ru",0,"UpdateTime")="62086,66625"

Глобал ^Dictionary — содержит все элементы справочников и их свойства, глобал ^NameDictionaryElement — содержит названия элементов справочников на всех языках.

Создать глобалы Ctr+С/V

Команда set — задаёт значение переменной (локальной или глобальной).

set ^Dictionary("Vehicle","TransmissionType",1,0,"UpdateTime")="62086,66625"
set ^Dictionary("Vehicle","TransmissionType",1,0,"uid")=888
set ^Dictionary("Vehicle","TransmissionType",2,0,"UpdateTime")="62086,66625"
set ^Dictionary("Vehicle","TransmissionType",2,0,"uid")=888
set ^NameDictionaryElement(1,"partUri",0)="akp"
set ^NameDictionaryElement(1,"partUri",0,"UpdateTime")="62086,66625"
set ^NameDictionaryElement(1,"ru",0)="АКП"
set ^NameDictionaryElement(1,"ru",0,"UpdateTime")="62086,66625"
set ^NameDictionaryElement(2,"partUri",0)="meh"
set ^NameDictionaryElement(2,"partUri",0,"UpdateTime")="62086,66625"
set ^NameDictionaryElement(2,"ru",0)="МЕХ"
set ^NameDictionaryElement(2,"ru",0,"UpdateTime")="62086,66625"

А теперь посмотрим как может быть устроен индекс справочника, и разберёмся для чего он нужен.
Читать полностью »

На хабре часто можно встретить различные статьи о том как сделано то или то, с непосредственной реализацией, кодом, примерами, обоснованиями (пусть даже спорными). Кто-то выкладывает пример контролла, кто-то даёт практические советы по яваскрипту. Однако я не видел, чтобы кто-нибудь, рассказывал об организации структуры БД. Дальше каких-то школьных примеров это не заходит (если ошибаюсь поправьте и дайте ссылки). Нет, холивары SQL vs NoSQL меня не интересуют. По моему скромному убеждению — СУБД вторична в вопросах организации БД. Вопросы производительности конкретных СУБД становятся актуальными далеко не сразу. Какая бы ни была выбрана СУБД, под определённую задачу, к производительности предъявляется всего одно требование — производительность должна быть достаточной. А вот пути достижения этой самой достаточности, способы удобно и красиво разместить данные — чтобы быстро и легко их извлекать, организация справочников и индексов, ввода и вывода, способы масштабирования и/или изменения структуры БД в течении жизни, используемые методики, решённые и нерешённые проблемы, полезные рецепты и советы — это всё то, о чём я хочу поговорить.

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

Я не работаю в интерсистемс, это указано в моём профайле только чтобы иметь возможность размещать статьи в их блог (отдельного хаба для MUMPS или COS на хабре нет). Так что описанные мной методы могут не совпадать с «заводскими» рекомендациями использования СУБД Cache и языка Cache Object Script.

Пару дней назад был опубликован перевод, в котором мой подход, к программированию БД, называли экстремальным — я с этим не совсем согласен. В комментариях, было как минимум три человека (Ogoun uaoleg 4dmonster), которые сказали, что им было бы интересно посмотреть на живое использование MUMPS и узнать почему не надо бояться глобалов. Для этих людей и всех тех, кому интересно обсудить затронутые мной темы, я и пишу данную статью.
Читать полностью »

В ходе работы над системой документооборота возникла задача — кэшировать справочники, использующиеся на клиентской стороне. Cистема была спроектирована в виде трехзвенки (БД — сервер приложения — клиентская часть), поэтому простора для фантазии было много.
Исходные условия: несколько десятков справочников, отличающихся по объему от нескольких записей до нескольких десятков тысяч записей в каждом. Каждая запись для большинства справочников хранит в себе полезные данные (обычно строку) и идентификатор записи (целое число).
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js