gifts2017

Два механизма, которые ускорили работу бухгалтеров в 1С

Опубликовал г. Казань Рустем Гумеров (Rustig) в раздел Программирование - Практика программирования

Речь пойдет о собственных идеях и их реализации. Доработки были проведены на конфигурации "1С: Бухгалтерия предприятия 8" в далеком 2010 году. Механизмы не привязаны к одной какой-либо типовой конфигурации - их можно реализовать в любой конфигурации. И даже не привязаны к платформе 1С - их можно реализовать на любой платформе. Возможно, эти идеи будут востребованы в самописных и отраслевых решениях 1С. Доработки достаточно просты, при этом ни в одной типовой конфигурации не реализованы.

   Из наблюдений за работой бухгалтеров: бухгалтера постоянно открывают список входящих платежек с отбором по контрагенту, чтобы увидеть, какие платежки по нему заведены в базе. Затем открывают список счетов на оплату с отбором по данному контрагенту. Затем открывают ОСВ по заданному счету опять-таки с отбором по контрагенту. Затем снова открывают счета на оплату, платежки и ОСВ по счету с отбором по другому контрагенту. И так много раз в течение рабочего дня…
   При этом в данном случае механизм структуры подчиненности документов и акты сверок практически не используются по ряду причин, и поэтому не могут ускорить работу бухгалтеров.  
    Чтобы открыть одну форму списка, установить отбор по контрагенту, затем открыть другую форму списка или отчет, снова установить отбор по контрагенту – понадобится с десяток кликов и 1-2-3 мин ожидания на отклик программы.
    Представляю вам две небольшие доработки программы, которые ускорили работу бухгалтеров:
1) переход в списки документов (отчеты) через контекстное меню (рис.1);
2) использование статистики частоты обращения в программе к контрагентам.

Входящие платежки

Рис. 1. Контекстное меню списка входящих платежек.

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

1. Переход в списки через контекстное меню


    Суть - в операционной системе Windows сильно развит механизм контекстного меню: при нажатии правой кнопки мыши выходит список команд, выполняемых с  объектом. Я реализовал подобный механизм в 1С – для каждого списка документов появляется контекстное меню со своим списком команд.
    На платформе 8 (обычные формы) имеется встроенный механизм контекстного меню, использующий командную панель как поставщика команд в соответствующее контекстное меню – вот этот механизм я взял за основу.
    В тех списках, где мне нужна была функциональность контекстного меню, я добавлял свою командную панель или использовал имеющуюся, относящуюся к форме – добавлял необходимые кнопки (рис.2, 3, 4).

Журнал счетов

 Рис. 2. Контекстное меню списка счетов на оплату.

ОСВ по счету

  Рис. 3. Контекстное меню оборотно-сальдовой ведомости по счету.

Счет на оплату

  Рис. 4. Контекстное меню счета на оплату.

    Чтобы разработка данного механизма и последующее добавление в новые формы не стала рутинной операцией, я создал одну командную панель, которую при необходимости копирую в новую форму вместе с процедурами. Лишние кнопки удаляю программно при открытии формы – те, которые относятся непосредственно к текущей форме (рис.5 и 6 и ниже – пример кода). Код разработки достаточно прост - представляю его вам исключительно с целью убедиться, что внедрить и запустить механизм контекстного меню достаточно просто (полдня работы).

Реестр контрагентов

 Рис. 5. Пример разработки контекстного меню для регистра сведений.

Командная панель

Рис. 6. Командная панель для реализации контекстного меню для регистра сведений.

 

 

//быстрый переход к другим документам {
Процедура КоманднаяПанельПереходКДокументамОткрытьОСВ(Кнопка)
    ТекСтрока = ЭлементыФормы.РегистрСведенийСписок.ТекущаяСтрока;    
    Если ТекСтрока = Неопределено Тогда       
       Возврат;    
    КонецЕсли;
    МодульПро.КоманднаяПанельПереходКДокументамОткрытьОСВ(ТекСтрока.Контрагент, ЭтаФорма);
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьКарточкуСчета(Кнопка)
    ТекСтрока = ЭлементыФормы.РегистрСведенийСписок.ТекущаяСтрока;
    Если ТекСтрока = Неопределено Тогда       
       Возврат;    
    КонецЕсли;
    МодульПро.КоманднаяПанельПереходКДокументамОткрытьКарточкуСчета(ТекСтрока.Контрагент, ЭтаФорма);
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьВходящиеПлатежки(Кнопка)
    ТекСтрока = ЭлементыФормы.РегистрСведенийСписок.ТекущаяСтрока;   
    Если ТекСтрока = Неопределено Тогда       
      Возврат;   
    КонецЕсли;
    МодульПро.КоманднаяПанельПереходКДокументамОткрытьВходящиеПлатежки(ТекСтрока.Контрагент, ЭтаФорма);
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьИсходящиеПлатежки(Кнопка)
    ТекСтрока = ЭлементыФормы.РегистрСведенийСписок.ТекущаяСтрока;  
    Если ТекСтрока = Неопределено Тогда         
      Возврат;    
    КонецЕсли;
    МодульПро.КоманднаяПанельПереходКДокументамОткрытьИсходящиеПлатежки(ТекСтрока.Контрагент, ЭтаФорма);
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьСправочникКонтрагенты(Кнопка)
    ТекСтрока = ЭлементыФормы.РегистрСведенийСписок.ТекущаяСтрока;   
    Если ТекСтрока = Неопределено Тогда        
      Возврат;    
    КонецЕсли;
    МодульПро.КоманднаяПанельПереходКДокументамОткрытьСправочникКонтрагенты(ТекСтрока.Контрагент, ЭтаФорма);
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьРеестрСвидетельств(Кнопка)
    ТекСтрока = ЭлементыФормы.РегистрСведенийСписок.ТекущаяСтрока;   
    Если ТекСтрока = Неопределено Тогда       
      Возврат;    
    КонецЕсли;
    МодульПро.КоманднаяПанельПереходКДокументамОткрытьРеестрСвидетельств(ТекСтрока.Контрагент, ЭтаФорма);
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамНазад(Кнопка)
    МодульПро.КоманднаяПанельПереходКДокументамНазад(ЭтаФорма);
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьСписокСчетов(Кнопка)
    ТекСтрока = ЭлементыФормы.РегистрСведенийСписок.ТекущаяСтрока;   
    Если ТекСтрока = Неопределено Тогда        
      Возврат;    
    КонецЕсли;
    МодульПро.КоманднаяПанельПереходКДокументамОткрытьСписокСчетов(ТекСтрока.Контрагент, ЭтаФорма);
КонецПроцедуры

Процедура ПриОткрытии()     
    МодульПро.УдалитьКнопкуИзКоманднойПанели(РегистрСведенийСписок, ЭтаФорма);
КонецПроцедуры
//быстрый переход к другим документам }



   Процедуры общего модуля "МодульПро" представлены ниже.


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

Процедура ОткрытьОтчет(НазваниеОтчета, Контрагент, ПредыдущаяФорма)
    Отчет = Отчеты[НазваниеОтчета].Создать();        
    Отчет.Счет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("76.05.3");    
    Отчет.Организация   = Справочники.Организации.НайтиПоКоду("000000001");      
    Отчет.ДатаНач       = Неопределено;    
    Отчет.ДатаКон       = Неопределено;
    Отчет.ЗаполнитьНачальныеНастройки();
    ФормаОтчета = Отчет.ПолучитьФорму(,ПредыдущаяФорма);
    ФормаОтчета.НеЗаполнятьНастройкиПриОткрытии = Истина;
    Если ЗначениеЗаполнено(Контрагент) Тогда       
      ФормаОтчета.Контрагент = Контрагент;    
    Иначе        
       Возврат;    
    КонецЕсли;
    ЭлементОтбора = Отчет.ПостроительОтчета.Отбор.Найти("Субконто1");   
    Если ЭлементОтбора = Неопределено Тогда       
      ЭлементОтбора = Отчет.ПостроительОтчета.Отбор.Добавить("Субконто1");   
    КонецЕсли;
    ЭлементОтбора.Использование = Истина;    
    ЭлементОтбора.ВидСравнения  = ВидСравнения.Равно; 
    ЭлементОтбора.Значение      = Контрагент;
    Если НазваниеОтчета = "ОборотноСальдоваяВедомостьПоСчетуХозрасчетный" Тогда       
      Отчет.ПостроительОтчета.ИзмеренияСтроки.Добавить("Субконто1");      
      Отчет.ПостроительОтчета.ИзмеренияСтроки.Добавить("Субконто2");        
    КонецЕсли;
    Если ФормаОтчета.Открыта() Тогда       
      ФормаОтчета.Активизировать();    
    Иначе        
      ФормаОтчета.Открыть();   
    КонецЕсли;
    ФормаОтчета.ОбновитьОтчет();
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьОСВ(Контрагент, ПредыдущаяФорма) Экспорт
    НазваниеОтчета = "ОборотноСальдоваяВедомостьПоСчетуХозрасчетный";   
    ОткрытьОтчет(НазваниеОтчета, Контрагент, ПредыдущаяФорма);
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьКарточкуСчета(Контрагент, ПредыдущаяФорма) Экспорт
    НазваниеОтчета = "КарточкаСчетаХозрасчетный";  
    ОткрытьОтчет(НазваниеОтчета, Контрагент, ПредыдущаяФорма);
КонецПроцедуры

Процедура ОткрытьПлатежки(НазваниеПлатежки, Контрагент, ПредыдущаяФорма)
    Если НазваниеПлатежки = "ПлатежноеПоручениеИсходящее" Тогда
    Запрос = Новый Запрос;       
    Запрос.Текст = "ВЫБРАТЬ        
    |   ПлатежноеПоручениеИсходящее.Ссылка        
    |ИЗ        
    |   Документ.ПлатежноеПоручениеИсходящее КАК ПлатежноеПоручениеИсходящее       
    |ГДЕ        
    |   (ПлатежноеПоручениеИсходящее.Контрагент = &Контрагент       
    |           ИЛИ ПлатежноеПоручениеИсходящее.КонтрагентДолжник = &Контрагент)";
    Запрос.УстановитьПараметр("Контрагент", Контрагент);
    Результат = Запрос.Выполнить();        
    Выборка = Результат.Выбрать();
    СЗ = Новый СписокЗначений;        
    Пока Выборка.Следующий() Цикл            
       СЗ.Добавить(Выборка.Ссылка);        
    КонецЦикла;
    ФормаСписка = Документы.ПлатежноеПоручениеИсходящее.ПолучитьФормуСписка(,ПредыдущаяФорма);        
    ОтборСписка     = ФормаСписка.ДокументСписок.Отбор;        
    ЭлементОтбора   = ОтборСписка.Ссылка;
    ЭлементОтбора.Использование     = Истина;        
    ЭлементОтбора.ВидСравнения      = ВидСравнения.ВСписке;    
    ЭлементОтбора.Значение          = СЗ;
    Если ФормаСписка.Открыта() Тогда           
      ФормаСписка.Активизировать();        
    Иначе            
      ФормаСписка.Открыть();        
    КонецЕсли;
    Иначе
       ФормаСписка     = Документы[НазваниеПлатежки].ПолучитьФормуСписка(,ПредыдущаяФорма);        
       ОтборСписка     = ФормаСписка.ДокументСписок.Отбор;        
       ЭлементОтбора   = ОтборСписка.Контрагент;
       ЭлементОтбора.Использование     = Истина;        
       ЭлементОтбора.ВидСравнения      = ВидСравнения.Равно;       
       ЭлементОтбора.Значение          = Контрагент;
       Если ФормаСписка.Открыта() Тогда          
           ФормаСписка.Активизировать();       
       Иначе           
           ФормаСписка.Открыть();    
       КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьВходящиеПлатежки(Контрагент, ПредыдущаяФорма) Экспорт
    НазваниеПлатежки = "ПлатежноеПоручениеВходящее";  
    ОткрытьПлатежки(НазваниеПлатежки, Контрагент, ПредыдущаяФорма);
КонецПроцедуры

ПроцедураКоманднаяПанельПереходКДокументамОткрытьИсходящиеПлатежки(Контрагент,ПредыдущаяФорма) Экспорт
    НазваниеПлатежки = "ПлатежноеПоручениеИсходящее";   
    ОткрытьПлатежки(НазваниеПлатежки, Контрагент, ПредыдущаяФорма);
КонецПроцедуры

ПроцедураКоманднаяПанельПереходКДокументамОткрытьСправочникКонтрагенты(Контрагент,ПредыдущаяФорма)  Экспорт
    ФормаЭлемента = Контрагент.ПолучитьФорму("ФормаЭлемента", ПредыдущаяФорма);
    Если ФормаЭлемента.Открыта() Тогда        
       ФормаЭлемента.Активизировать();   
    Иначе        
       ФормаЭлемента.Открыть();    
    КонецЕсли;
КонецПроцедуры

ПроцедураКоманднаяПанельПереходКДокументамОткрытьРеестрСвидетельств(Контрагент, ПредыдущаяФорма) Экспорт
    ФормаСписка     = РегистрыСведений.РеестрЧленовПартнерства.ПолучитьФормуСписка(,ПредыдущаяФорма);   
    ОтборСписка     = ФормаСписка.РегистрСведенийСписок.Отбор;    
    ЭлементОтбора   = ОтборСписка.Контрагент;
    ЭлементОтбора.Использование     = Истина;    
    ЭлементОтбора.ВидСравнения      = ВидСравнения.Равно;   
    ЭлементОтбора.Значение          = Контрагент;
    Если ФормаСписка.Открыта() Тогда       
        ФормаСписка.Активизировать();   
    Иначе        
        ФормаСписка.Открыть();   
    КонецЕсли;
КонецПроцедуры

ПроцедураКоманднаяПанельПереходКДокументамОткрытьСтатусыКонтрагента(Контрагент,ПредыдущаяФорма) Экспорт
    ФормаСписка     = РегистрыСведений.СтатусыКонтрагентов.ПолучитьФормуСписка(,ПредыдущаяФорма);
    ОтборСписка     = ФормаСписка.РегистрСведенийСписок.Отбор;   
    ЭлементОтбора   = ОтборСписка.Контрагент;
    ЭлементОтбора.Использование     = Истина;   
    ЭлементОтбора.ВидСравнения      = ВидСравнения.Равно;  
    ЭлементОтбора.Значение          = Контрагент;
    Если ФормаСписка.Открыта() Тогда       
       ФормаСписка.Активизировать();  
    Иначе       
       ФормаСписка.Открыть();   
    КонецЕсли;
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамОткрытьСписокСчетов(Контрагент, ПредыдущаяФорма) Экспорт
    Форма = ЖурналыДокументов.ЖурналСчетов.ПолучитьФорму(,ПредыдущаяФорма);   
    ОтборСписка     = Форма.ЖурналДокументовСписок.Отбор;    
    ЭлементОтбора   = ОтборСписка.Контрагент;
    ЭлементОтбора.Использование     = Истина;   
    ЭлементОтбора.ВидСравнения      = ВидСравнения.Равно;  
    ЭлементОтбора.Значение          = Контрагент;
    Если Форма.Открыта() Тогда       
       Форма.Активизировать();    
    Иначе       
       Форма.Открыть(); 
    КонецЕсли;
КонецПроцедуры

Процедура КоманднаяПанельПереходКДокументамНазад(ЭтаФорма) Экспорт
    ПредыдущаяФорма = ЭтаФорма.ВладелецФормы;   
    Если ТипЗнч(ПредыдущаяФорма) = Тип("Форма") И ПредыдущаяФорма <> Неопределено Тогда        
       ПредыдущаяФорма.Открыть();       
       ЭтаФорма.Закрыть();    
    КонецЕсли;
КонецПроцедуры
//быстрый переход к другим документам }


 

     Из моих наблюдений: типовое контекстное меню в формах списков практически не используется. Контекстное меню, доработанное под задачи Заказчика – используется на 100%. Переход между формами при использовании контекстного меню происходит в два клика (правая, затем левая кнопки мыши) и за две секунды. Отличный результат!


2. Использование статистики обращения в базе к контрагентам

    Как было. Из наблюдений за работой бухгалтеров: если в открытой форме необходимо заполнить или выбрать контрагента, то на поиск контрагента уходит более 20 секунд. Связано это с тем, что контрагентов более 3000, наименования похожи и даже одинаковы, если из разных городов.
    Также часто происходит так: один бухгалтер просмотрел заведенный документ или создал новый, дал поручение другому бухгалтеру – отправить счет на оплату на электронку, прокрыжить расхождения или др. Второй бухгалтер открывает формы документов, отчеты и анализирует того же контрагента.  
     Или другая ситуация: звонит контрагент - поднявший трубку бухгалтер в программе сверил долг контрагента, затем переключает на второго бухгалтера для продолжения разговора. При этом наименование контрагента передает второму бухгалтеру по телефонной трубке – на запоминание практически нет времени. Второму бухгалтеру требуется быстро открыть форму списка документов, быстро установить отбор по данному контрагенту.
    В результате я создал регистр сведений «Обращения к контрагентам», в определенных формах, где имеется поле «Контрагент», через событие ПриИзменении поля записываю в этот регистр сведений информацию об обращении (рис.7 и ниже код программы).

 Обращения к контрагентам

Рис. 7. Регистр сведений "Статистика обращений".

 

Процедура КонтрагентПриИзменении(Элемент)
     Если ЗначениеЗаполнено(Контрагент) Тогда
        ОтборПоКонтрагенту = ЖурналДокументовСписок.Отбор.Контрагент;        
        ОтборПоКонтрагенту.Установить(Контрагент);
        МодульПро.ЗафиксироватьОбращениеККонтрагенту(Контрагент);
    КонецЕсли;
КонецПроцедуры

Процедура КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)    
    МодульПро.КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка);
КонецПроцедуры



Процедуры общего модуля представлены ниже.

 

//оптимизация работы - упорядочивание списка контрагентов в поле ввода быстрого поиска
Процедура ЗафиксироватьОбращениеККонтрагенту(Контрагент) Экспорт
    НЗ = РегистрыСведений.ОбращенияККонтрагенту.СоздатьНаборЗаписей(); 
    НЗ.Отбор.Контрагент.Установить(Контрагент); 
    НЗ.Отбор.Период.Установить(ТекущаяДата()); 
    НЗ.Прочитать();
    Запись = ?(НЗ.Количество()=1, НЗ[0], НЗ.Добавить()); 
    Запись.Период = ТекущаяДата(); 
    Запись.Контрагент = Контрагент; 
    Запись.КоличествоОбращений = Запись.КоличествоОбращений + 1;
    НЗ.Записать();
КонецПроцедуры

Процедура ОбнулитьСтатистикуОбращенийККонтрагентам() Экспорт
    Запрос = Новый Запрос; 
    Запрос.Текст = "ВЫБРАТЬ 
    | ОбращенияККонтрагенту.Период 
    |ИЗ 
    | РегистрСведений.ОбращенияККонтрагенту КАК ОбращенияККонтрагенту 
    |ГДЕ 
    | ОбращенияККонтрагенту.Период <> &Период";
    Запрос.УстановитьПараметр("Период", НачалоДня(ТекущаяДата()));
    Результат = Запрос.Выполнить(); 
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
       НЗ = РегистрыСведений.ОбращенияККонтрагенту.СоздатьНаборЗаписей(); 
       НЗ.Отбор.Период.Установить(Выборка.Период); 
       НЗ.Записать();
    КонецЦикла;
КонецПроцедуры



  Обнуление статистики происходит при завершении работы с программой пользователя с Ролью «ОбнулятьСтатистикуОбращений». Из трех бухгалтеров такую роль имеют любые два бухгалтера из соображений, что в отпуск они уходят по очереди и по одному.
    В формах, где происходит выбор контрагента, переопределено событие ОкончаниеВводаТекста: в выпадающем списке контрагенты упорядочиваются по количеству обращений – как правило, первым в списке появляется контрагент, который только что был выбран в другой форме. Так как в данном списке в названии контрагента отображается город и фамилия руководителя, то в выпадающем списке контрагент определяется однозначно (рис.8 и ниже код программы).

Подбор контрагентов

Рис. 8. Поле быстрого поиска контрагента (быстрый отбор по контрагенту).

 

Процедура КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка) 
   МодульПро.КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка);
КонецПроцедуры


Процедура общего модуля представлена ниже.

 

Процедура КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка) Экспорт
    СтандартнаяОбработка = Ложь;
    Запрос = Новый Запрос;    
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ    
    |   Контрагенты.Ссылка КАК Ссылка,    
    |   Контрагенты.Наименование,    
    |   Контрагенты.ИНН,    
    |   Контрагенты.ПометкаУдаления,   
    |   ЕСТЬNULL(СтатистикаОбращений.КоличествоОбращений, 0) КАК КолвоОбращений    
    |ИЗ    
    |   Справочник.Контрагенты КАК Контрагенты    
    |       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ    
    |           ОбращенияККонтрагентуСрезПоследних.Контрагент КАК Контрагент,    
    |           ОбращенияККонтрагентуСрезПоследних.КоличествоОбращений КАК КоличествоОбращений    
    |       ИЗ    
    |           РегистрСведений.ОбращенияККонтрагенту.СрезПоследних КАК ОбращенияККонтрагентуСрезПоследних) КАК СтатистикаОбращений    
    |       ПО Контрагенты.Ссылка = СтатистикаОбращений.Контрагент    
    |ГДЕ   
    |   (Контрагенты.Наименование ПОДОБНО ""%"" + &Текст + ""%""   
    |           ИЛИ Контрагенты.ИНН ПОДОБНО ""%"" + &Текст + ""%"")   
    |   И Контрагенты.ЭтоГруппа = ЛОЖЬ    
    |   И Контрагенты.ПометкаУдаления = ЛОЖЬ   
    |   
    |УПОРЯДОЧИТЬ ПО    
    |   КолвоОбращений УБЫВ,   
    |   Ссылка   
    |АВТОУПОРЯДОЧИВАНИЕ";
    Запрос.УстановитьПараметр("Текст", Текст);
    Результат = Запрос.Выполнить();    
    Выборка = Результат.Выбрать();
    Если Выборка.Количество()=1 И Выборка.Следующий() Тогда        
       Значение = Выборка.Ссылка;        
       Возврат;    
    КонецЕсли;
    Значение = Новый СписокЗначений;
    Если Выборка.Количество() >= 50 Тогда //выгрузим первые 49 организаций согласно статистики обращений и сообщим об этом пользователю
        Значение.Добавить(Справочники.Контрагенты.ПустаяСсылка(), " ... НАЙДЕНО  БОЛЕЕ  50  ЭЛЕМЕНТОВ!  ЗАДАЙТЕ  ДРУГУЮ  СТРОКУ  ПОИСКА ...");
        Колво = 1;
        Пока Выборка.Следующий() И Колво < 50 Цикл
            Адрес = ПолучитьАдресИРуководителя(Выборка.Ссылка);
            Значение.Добавить(Выборка.Ссылка, "" + ВРЕГ(СокрЛП(Выборка.Наименование)) + ", ИНН " + Выборка.ИНН + "   "                                
            + Адрес, Выборка.ПометкаУдаления);
            Колво = Колво + 1;
        КонецЦикла;
    Иначе
        Пока Выборка.Следующий() Цикл
            Адрес = ПолучитьАдресИРуководителя(Выборка.Ссылка);
            Значение.Добавить(Выборка.Ссылка, "" + ВРЕГ(СокрЛП(Выборка.Наименование)) + ", ИНН " + Выборка.ИНН + "   "                                
            + Адрес, Выборка.ПометкаУдаления);
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры


 

   После внедрения статистики обращения подбор контрагента в формах списков и отчетах ускорился с 20 секунд до 3 секунд. Отличный результат!

  На мой взгляд, статистику обращений можно с успехом внедрить в отдел продаж для менеджеров, например как элемент подсистемы CRM. Контекстное меню с успехом можно внедрять в любой отдел, программируя свою функциональность, соответствующую каждому отделу. :)

Всем всего доброго и успехов в работе!

Центр автоматизации, г. Казань http://go-scan.ru/

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Дима (Antel) 13.06.15 19:12
Увидел надписи в "капсе" на картинках и дальше смотреть не стал.

П.С. бухгалтера такие тупые что прочитать без капса не смогут
корум; sergelemon; webester; +3 3 Ответить 2
2. Василий Коровин (vasyak319) 13.06.15 20:30
(1) Antel, чувство прекрасного у автора, конечно, своеобразное, но идеи мне понравились. Не понял только, WTF "обнуление статистики при завершении работы пользователя с ролью".
3. script Мальчинко (script) 13.06.15 23:19
Предложу идею.

Задача
1. Необходимо в конфигурации Бухгалтерия 8.2. иметь журнал всех документов купателей, а именно: счета, реализации, акты сверок, налоговые, платежки, прих. кассовые ордера, и т.д.
2. Необходимо иметь возможность переходить в данный журнал из формы любого документа или из формы списка любого документа.
3. При переходе в полный журнал необходимо устанавливать отбор по контрагенту, который берется из документа источника.

Решение.
1. Здесь описывать нечеого.
2. Возникает необходимость изменять формы документов и формы списков, добавляя в командную панель новую кнопку "Перейти в полный журнал". Или добавиьь новый пункт меню в меню "Перейти", как это зделано у автора статьи.

Вот здесь остановимся. Все согласятся что менять кучу объектов в типовой конфе -это не по фэншую.
Предлагаю добавить новый объект конфигурации, а именно КритерийОтбора.ПолныйЖурнал.
Для нового объекта создаем форму, в которой приоткрытии пропишем переход в полный журнал с отбором.
Собственно все. вый объект автоматически добавиться в меню " Перейти".

4. MaxDavid (MaxDavid) 13.06.15 23:26
(1) Antel,
Увидел надписи в "капсе" на картинках и дальше смотреть не стал.
Полагаю, капс понадобился для быстрого визуального отличия стандартных пунктов контекстного меню от добавленных.
5. Роман Ложкин (webester) 14.06.15 06:24
(4)То что буквы разные, этого недостаточно? В последнем скрине, в строке поиска, он что от чего отличает? Какими то 90ми пахнуло сразу и пенсионка в ДОСовском окне. Хардкодить ссылки в коде, типа "Организации.НайтиПоКоду("000000001")" тоже еще та глупость, обсудили уже сотню другую раз. Код не отформатирован и свален в кучу, считаю проявлением банальной лени и наплевательством выкладывание его в таком виде.
корум; u_n_k_n_o_w_n; Зеленоград; sergelemon; +4 1 Ответить 1
6. Роман Ложкин (webester) 14.06.15 06:27
(5)А так это старый добрый Rustig, претензии сняты. не сразу узнал маэстро по почерку.
7. г. Казань Рустем Гумеров (Rustig) 14.06.15 08:20
(3)
2. Необходимо иметь возможность переходить в данный журнал из формы любого документа или из формы списка любого документа.

1) используя только типовые механизмы платформы (в том числе, критерий отбора) у вас не получится перейти в "полный журнал" из формы отчетов, не получится реализовать кнопку "Назад", да и вообще речь идет не о переходе в журнал документов, а о реализации "правой кнопки" мыши "удобно и практично", как это реализовано в Windows.
2) критерий отбора - отличный механизм, только ведь я написал что на данный момент измененная конфа не обновляется, что изложенные идеи возможно будут интересны для самописных и отраслевых решений, а вы пытаетесь "придумать", как это реализовать на типовой БП с минимальными потерями автоматического обновления. Раньше в конфигурациях не было возможности создавать собственные механизмы "Ввода на основании", не изменяя конфигурацию - сейчас это возможно реализовывать через "Внешние отчеты и обработки". Никто не пытается "натянуть" механизм "Ввода на основании" на старые механизмы платформы 8.2. Возможно, в будущем в платформе 8.3 будет реализован механизм, когда через "Внешние отчеты и обработки" мы сможем создавать свои командные панели или свои меню в этих панелях...
8. Василий Коровин (vasyak319) 15.06.15 09:39
(3) script, во-первых, чтобы добавить в формы документов БП2.0 (ну нету в природе конфигурации "Бухгалтерия 8.2") кнопку сами формы менять не нужно. Во-вторых, критерий отбора ДокументыПоДоговоруКонтрагента там уже есть. Не совсем то, но использовать для этих целей можно. В-третьих, вы долго будете в документах БП2.0 искать меню "Перейти" - нету его там.
9. Марина Чирина (chmv) 15.06.15 09:55
10. script Мальчинко (script) 15.06.15 13:57
(8) vasyak319,
А у меня есть, потому что я в основном работаю с Бухгалтерей 8.2 ред 1.2 для Украины. Там везеде, в журналах, такая кнопка присутствует.
11. Александр Губанов (gubanoff) 15.06.15 14:08
Статистика - это прекрасно. На самом деле делается быстро, а помочь может реально. Плюс программа превращается из калькулятора в подобие искусственного интеллекта, мне кажется, за этим будущее.
Ознакомился с публикациями автора, автор склонен к нестандартным решениям :)
Rustig; serg1983; Serg O.; pt_olga; +4 Ответить
12. Андрей Акулов (DrAku1a) 17.06.15 04:06
НЕ, РЕАЛЬНО, ЗАЧЕМ СТОЛЬКО "КЭПСА" ВЕЗДЕ? У ВАС НАСТОЛЬКО СЛЕПЫЕ БУХГАКТЕРЫ???

P.S. А идеи правильные и отличные!
13. Евгений jhj (Mantis) 17.06.15 07:31
Спасибо, идеи интересные.
14. г. Казань Рустем Гумеров (Rustig) 17.06.15 09:15
(12) женщины-бухгалтера мелкий, то есть стандартный шрифт, плохо видят, все в очках. Они не работают за ноутбуками, у которых экран по факту расположен ближе, чем отдельно стоящий монитор на столе. Стол широкий, монитор на краю стола, я лично сам не вижу - приходится приближать лицо к экрану. :(
Я в конфигурации изменил стандартный стиль - увеличил шрифт до 10, вы этого видимо не заметили, что журналы документов тоже крупнее, чем обычно, и отчеты крупнее. Также в конфигурации имеется служебная обработка, которая любой текст переводит в верхний регистр, потому что это часто приходилось делать...
Вообще что для вас "капса", для этих женщин-бухгалтеров нормальный размер шрифта.
15. Алексей (LineykaSBK) 17.06.15 12:01
(6) webester,
странное у Вас представление о претензиях. Сначала предъявил, потом не предъявил :+)
16. Наталья Воронцова (tramontana) 19.06.15 12:04
(14) Rustig, странное у вас представление о бухгалтерах. Прям сплошь слепые бабки, которые не знают, что монитор можно двигать.
17. NickKrsk (nick_krsk) 25.06.15 13:08
(2) vasyak319, чтобы РС не засорять, видимо.
18. Fomix (fomix) 25.06.15 14:52
Плюсую, потому, что рад видеть в авторе разработчика, который не только о красоте кода заботится! Это, к сожалению, становится редкостью в наших рядах...
19. Hromov Anton (hromovanton) 24.09.15 09:35
(6) webester, А если бы это был не "старый добрый Rustig", то поливали бы дальше? !
u_n_k_n_o_w_n; +1 Ответить