gifts2017

Подключение одного классификатора адресов для типовых без загрузки в каждую базу

Опубликовал Саша (Хряк) в раздел Программирование - Практика программирования

Подключить один кладр на все базы - элементарно.
Невероятно, но факт, для большинства типовых, таких как ТиС, Бух, УСН, ПУБ, ПБОЮЛ, Комплексная, Бюджетная подключить один Кладр на все базы элементарно. Достаточно добавить в конфигураторе константу КаталогКлассификаторов (тип строка, длина, например, 80), в программе указать в ней путь до Кладра, например, D:\Kladr.

При вводе адреса надо зайти на закладку Классификаторы и выбрать 2003 г.
В релизах после 495 надо установить галку "Показывать только значимые адреса" дабы не задваивались города в списке выбора. Так же желательно открыть в конфигураторе обработку ВводАдреса, найти строки и изменить значение
Если ПустоеЗначение(ФорматКлассификатора) = 1 Тогда
ФорматКлассификатора = 2;//яИзменил, было 1
КонецЕсли;

Если ПустоеЗначение(ПоказыватьТолькоЗначимые) = 1 Тогда
ПоказыватьТолькоЗначимые = 1;//яИзменил, было 0
КонецЕсли;
В противном случае в каждой новой базе при выборе 2003 г. взводится флаг изменения формата и при открытии региона и проч. в первый раз будет предложено переиндексировать классификатор, а это пустая трата времени.

Всё... Наслаждайтесь. И не надо грузить в каждую базу по 100 мб кладра, и с обновлениями проблем нет.
Поражает, что одинэсчики уже давно заложили и реализовали функционал подключения Кладра через эту константу, но почему-то не дают им воспользоваться, т.е. не включают константу в конфигурации. Изобрели, понимаешь, велосипед, но ездить на нём не дают, да и сами не ездят :))) И почему студенты из 1С до сих пор этого не сделали?! :)))
Ну, что ж, сделаем это за них...

Для ЗиК и Налогоплательщик всё несколько сложнее... Ибо одинэсчики решили грузить Кладр в справочники, а не считывать с диска. В результате объем базы возрастает несоизмеримо с самими данными, вводимыми в базу. И мы вынуждены ждать пока переиндексируестя справочник street да kladr после сбоя, да и при архивации эта справочная инфа ни к чему :)))
Далее предложу переделать механизм работы с Кладром как в бухии.

Если кто готов к внесению незначительных изменений в МД и поддержке последующих обновлений, пожалуйста, прочтите нижеследующее. Переделка займет не более 15 мин., а при обновлениях и того меньше.
Итак, после добавления константы делаем:

1. Копипастим обработку ВводАдреса и ИмпортАдресныхКлассификаторов из Бухии в ЗиК. Они появятся в ЗиКе под именем ВводАдреса1 и ИмпортАдресныхКлассификаторов1.
Открываем обработку ВводАдреса1, ищем поиском строку "Справочник("STREET")" и строки

ИначеЕсли Метаданные.Обработка("ВыборИзКлассификатораАдресов").Выбран() = 1 Тогда
ОткрытьФорму("Обработка.ВыборИзКлассификатораАдресов", Параметры);

переносим в начало условия Если... (там всего 2 вхождения).

2. Из Бухии обработку ВыборИзКлассификатораАдресов сохраняем как внешний отчет (это связано с наличием картинок на форме. При простом копипасте картинки не сохраняются). В ЗиКе создаем новую обработку, обзываем её ВыборИзКлассификатораАдресов и заменяем на сохранённый внешний отчет.

3.Добавляем в начало ГМ
//яИзменил взял из Бухии
Перем глСписокУлиц Экспорт;
Перем глВладелецСпискаУлиц Экспорт;
//яИзменил


4.Копируем из ГМ бухии процедуру глВводАдреса и вставляем её над (перед)аналогичной процедурой в ЗиК и обзываем её глВводАдреса1.
Да вот он, этот кусок кода:
//******************************************************************************
//яИзменил{ взял из бухии
//
// глВводАдреса1(Адрес, ФорматАдреса = 0)
//
// Параметры:
//  Адрес (строка), адрес который необходимо отредактировать.
//  ФорматАдреса (число) 1 - адрес может только вводится в формате МНС,
//                       0 - адрес может вводится в формате МНС и произвольном формат.
//                       иначе - адрес может вводится только в произвольном формат.
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Процедура открывает форму ввода (редактирования адреса).
 
Процедура глВводАдреса1(Адрес, ФорматАдреса = 0) Экспорт
 
Если ТипЗначенияСтр(Адрес) <> "Строка" Тогда
Адрес = "";
КонецЕсли;
Если ФорматАдреса = 0 Тогда
ОткрытьФормуМодально("Обработка.ВводАдреса1", Адрес);
Иначе
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.Установить("Адрес", Адрес);
Параметры.Установить("Формат адреса", ФорматАдреса);
ОткрытьФормуМодально("Обработка.ВводАдреса1", Параметры);
Если ТипЗначенияСтр(Параметры) = "СписокЗначений" Тогда
Если Адрес <> Параметры.Получить("Адрес") Тогда
Адрес = Параметры.Получить("Адрес");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // глВводАдреса1()
//яИзменил


Родную функцию ЗиК глВводАдреса также заменяем на вот эту немного измененную:
//******************************************************************************
// глВводАдреса(Форма,Реквизит)
//
// Параметры:
//  Форма - контекст формы в которой отражается адрес
//  Реквизит - реквизит формы (либо переменная), строка в формате "9 запятых"
//  
// Возвращаемое значение  
//  строка - адрес  
//  
// Описание:
//  Предназначена для ввода адреса
//  Вызывается по кнопке формы
//  
Функция глВводАдреса(Форма,Реквизит) Экспорт
 АдресИзБД=1;
 Если Метаданные.Константа("КаталогКлассификаторов").Выбран() = 1 Тогда
  пКаталог = СокрЛП(Константа.ПолучитьАтрибут("КаталогКлассификаторов"));
  Если ПустоеЗначение(пКаталог)=0 Тогда
   АдресИзБД=0;
   Если ФС.СуществуетФайл(пКаталог)=0 Тогда
    Если ФС.СуществуетФайл(пКаталог+"\")=0 Тогда //для 98
     АдресИзБД=1;
    КонецЕсли;
   КонецЕсли;
  КонецЕсли;
 КонецЕсли;
 
 Попытка
  ВидФормы = Форма.Вид();
 Исключение   
  ВидФормы = ""; // из обработки Настройка - реквизитов нет, есть только переменные
 КонецПопытки;
 
 Параметры = СоздатьОбъект("СписокЗначений");
 Если ВидФормы = "" Тогда
  Параметры.ДобавитьЗначение(Реквизит);
 Иначе
  Параметры.ДобавитьЗначение(Форма.ПолучитьАтрибут(Реквизит));
 КонецЕсли;
 
 Если ВидФормы = "Сотрудники" тогда
  // НЕ использование слоя произвольного формата
  Параметры.ДобавитьЗначение(0);
 Иначе
  // использование слоя произвольного формата
  Параметры.ДобавитьЗначение(1);
 КонецЕсли; 

 Если Реквизит="АдресВСтранеПроживания" Тогда
  ОткрытьФормуМодально("Обработка.ВводАдресаПроживания",Параметры) 
 Иначе
  Если АдресИзБД=0 Тогда
   Попытка
    Адрес=Форма.ПолучитьАтрибут(Реквизит);
   Исключение
    Адрес=Реквизит;//из обработки передается переменная
   КонецПопытки;
 
   Если Реквизит="АдресВСтранеПроживания" Тогда
    ОткрытьФормуМодально("Обработка.ВводАдресаПроживания",Параметры);
   Иначе
    глВводАдреса1(Адрес);
    Попытка
     Форма.УстановитьАтрибут(Реквизит,Адрес);
    Исключение
     Возврат Адрес;
    КонецПопытки;
    Возврат "";
   КонецЕсли;
  Иначе
   ОткрытьФормуМодально("Обработка.ВводАдреса",Параметры)
  КонецЕсли;
 КонецЕсли;

 Если ВидФормы = "" Тогда
  Если Параметры <> "Отмена" тогда
   Возврат Параметры
  Иначе
   Возврат Реквизит
  КонецЕсли;
 ИначеЕсли Параметры <> "Отмена" тогда
  Если СокрЛП(Форма.ПолучитьАтрибут(Реквизит))<>СокрЛП(Параметры) Тогда
   Форма.УстановитьАтрибут(Реквизит,Параметры);
  КонецЕсли;
  Возврат Параметры
 КонецЕсли;
 Возврат ""
КонецФункции // глВводАдреса
//яИзменил}

Теперь, если в константе указать путь для Кладра - Кладр будет считываться с диска, если же константу очистить, можно будет грузить Кладр в справочник как и было раньше (ну, это для тех неверующих, кто хочет откатиться к прежнему варианту).

Вот собссно и всё...

При обновлениях нужно будет выполнить пункт 3 и 4.
Я думаю это займет не более 2-х минут.

ЗЫ: Можно (или даже нужно) удалить файл справочника street из базы. У меня в ред. 273 он называтся SC551.dbf и SC551.cdx - у вас может называться по-другому, хотя, маловероятно. Откройте *.dd файл на просмотр и поиском по "street" найдите строки:

#==TABLE no 10 : Справочник STREET
# Name |Descr |Type[A/S/U]|DBTableName|ReUsable
T=SC551 |Справочник STREET |A |SC551 |1

SC551 - это и есть имя файла, который нужно удалить.
Затем, следует запустить программу монопольно.

Спасибо за внимание. Всем Удачи!

ЗЫ: Актуальный на сегодня КЛАДР берём здесь: http://www.gnivc.ru/inf_provision/classifiers_reference/kladr/

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Дмитрий (dmsob) 19.02.07 21:36
что-то не понял в чём фишка? в названии константы?
2. Саша (Хряк) 19.02.07 23:03
Фишка в том, что 1эсчики реализовали функционал подключения кладра через эту константу, но почему-то не дают им воспользоваться, т.е. не включают константу в конфигурации. Ну, совсем непонятно почему?
Ёпрст; +1 Ответить
3. Andr (andrey995) 20.02.07 10:17
да, поразительно, респект Автору
4. Дмитрий (dmsob) 21.02.07 07:55
Круто!! а то у меня около 20 баз и везде по 100 мегов КЛАДР-а!!! Спасибо!
5. Олег Пономаренко (O-Planet) 21.02.07 23:19
+ 1 Надо проверить, конечно, но хочется верить аффтору на слово. Может, потому, что кладры задолбали в натуре...
6. Вячеслав (slavapil) 22.02.07 09:50
Есть внешний отчет "Ввод адреса по классификатору КЛАДР"
http://infostart.ru/projects/779/?ref=1552
, и ничего в коде править не надо.
Заменили "ВводАдреса", и ВСЁ ;)
+1 за иголку в стоге сена :)
7. Andr (andrey995) 04.03.07 23:55
для всех сомневающихся - пользуюсь доработкой несколько дней - никаких глюков не замечено ;)
8. Victor Nespyatin (victuan) 05.03.07 05:05
Насчет константы. Если баз много, а классификатор один (в одном каталоге), то можно ли им пользоваться одновременно из нескольких баз? Ведь 1С может открывать внешние dbf-файлы только в эксклюзивном режиме, и если КЛАДР открыт в одной базе, то из других к нему уже не обратиться!
9. Саша (Хряк) 07.03.07 12:28
victuan, не пугай народ. Обращайся к одному кладру со скольких хочешь программ 1с одновременно. До сих пор жалоб на блокировки не поступало.
10. Victor Nespyatin (victuan) 09.03.07 06:03
Это потому что никто не пытался в одно время редактировать адрес в разных базах. А такое вполне возможно по сети, если пользователей много. Проверь сам, если мне не веришь.
11. Alexander (likan) 16.01.09 12:30
Даже если ктото и редактирует адрес - так тока в карточке клиента и ДБФ открыты тока на чтение шоб выцепить инфо по городам/районам/улицам...
12. ShoGUN (ShoGUN) 31.01.09 00:20
victuan, это же ерунда. Ну выдастся ошибка 1 раз в 100 случаев. Почему кстати она не выдается, если из одной базы, но из разных сеансов редактировать адреса? По идее в этом случае тоже должна быть блокировка.
13. Олег (OSlike) 03.04.09 00:41
14. Андрей (andru_dv) 29.09.11 13:47
Спасибо! Хорошая идея.
А я раньше грузил классификатор а одну базу, а затем
копировал папку Extdb в другие базы, чтобы каждый раз не ждать пока он грузиться снова и снова.
Плюсую!
15. Михаил Ражиков (tango) 27.01.12 21:27
плюса просто за идею. кладр достал реально
16. tomas popov (tomas303) 01.03.13 16:43
А есть ли такая же возможность с 8.2 Бух и Зуп сделать по КЛАДРУ, у меня порядка 80 баз , уже устал грузить туда кладры???
17. Андрей Зиненко (Chastiser) 06.06.13 10:34
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа