Мастер класс «O-Planet»: Произвольный отчет с группировками.

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

Разработка - Практика программирования

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

Как раз очень кстати у меня есть заказ по написанию такого отчета, который нужен к завтраму. В общих словах, имеется модифицированная программа «1С:Бухгалтерия 7.7», в которой ведется учет расхода материалов в мебельном производстве. Директор пожелал видеть этот расход в разрезе групп материалов, заказчиков и дней выпуска. Самое смешное, что выпущенная продукция его почему-то не интересует. Они ее вообще обобщают: мебель, резка, еще что-то. Впрочем, какая разница, что у меня за задача! Сейчас мы обсуждаем универсальную технологию быстрого написания отчета с произвольным количеством группировок. Поэтому, поехали!

1. Суть метода

Определяем одну или несколько базовых группировок и делаем самый подробный запрос по ним. Чаще всего, базовой группировкой, из которой можно все достать, будет документ и (или) строка документа. Данные запроса выгружаем в таблицу. Для каждого уровня группировок заводим новую таблицу, выгружаем в нее данные из основной, сворачиваем так, как нам надо, сортируем. Строим отчет простым обходом базовой таблицы, отслеживая изменения значения полей группировок, и, когда нужно, выводим итоговые секции.


Возможно, метод не самый оптимальный, но достаточно простой, универсальный и быстрый.

2. Создаем форму отчета.

Это просто. Чтобы особо не возиться, можно взять «кусочки» из отчетов «1С:Торговля и склад 7.7». На форму отчета устанавливаем выбор периода, поля для фиксированных значений отдельных группировок и список самих группировок. Функции кнопок сдвига списка также забираем из типового отчета, если писать их лень.

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

В моем случае список будет выглядеть так:

Группировки.ДобавитьЗначение("Группа","Группа материалов");
Группировки.ДобавитьЗначение("Материал","Материал");
Группировки.ДобавитьЗначение("Контрагент","Заказчик");
Группировки.ДобавитьЗначение("ДатаДок","Дата");
Группировки.ДобавитьЗначение("ТекущийДокумент","Документ"); 


3. Строим основной запрос в процедуре «Сформировать»

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

А пока у меня получилось следующее:

"//{{ЗАПРОС(Сформировать)
|Период с ДатаНачала по ДатаКонца;
|Обрабатывать НеПомеченныеНаУдаление;
|ТекущийДокумент = Документ.ТребованиеНакладная.ТекущийДокумент;
|ДатаДок = Документ.ТребованиеНакладная.ДатаДок;
|Материал = Документ.ТребованиеНакладная.Материал;
|Группа = Документ.ТребованиеНакладная.Материал.Родитель;
|Цена = Документ.ТребованиеНакладная.Цена;
|Количество = Документ.ТребованиеНакладная.КоличествоОтпущено;
|ВидПеремещения = Документ.ТребованиеНакладная.ВидПеремещения;
|Контрагент = Документ.ТребованиеНакладная.Накладная.Контрагент;
|Группировка ТекущийДокумент;
|Группировка СтрокаДокумента;
|Условие(ВидПеремещения = 0);
|"//}}ЗАПРОС


Мне вообще крупно повезло: даже не приходится возиться с бухгалтерскими итогами (кстати, по настоянию бухши!) У них в программе цены в строках документов соответствуют средним суммам по проводкам, и в накладной по списанию материалов хранится ссылка на реализацию. (Сам делал так, самому смешно!)

Текст запроса присвоим одноименной переменной. Также нам понадобится пустая строка СтрШапки.

4. Добавляем в запрос условия отбора.

Нам понадобится процедурка типа такой:

Процедура ДобавитьУсловие(ТекстЗапроса,Рекв,Имя,Слово,СтрШапки=0,Знак="=")
ТекстЗапроса=ТекстЗапроса+"Условие("+Имя+Знак+"Выб"+Имя+");";
Если СтрШапки<>0 Тогда
  СтрШапки=СтрШапки+?(СтрШапки="","",РазделительСтрок)+
    "Отбор по "+Слово+": """+СокрЛП(Рекв.Наименование)+"""";
КонецЕсли;
КонецПроцедуры // ДобавитьУсловие() 


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

Помести под определением первичного текста нашего запроса проверку выбранных условий по типу:

Если ВыбИМЯ.Выбран()=1 Тогда
ДобавитьУсловие(ТекстЗапроса,Выб … ,"ИМЯ","РАСШИФРОВКА",СтрШапки);
КонецЕсли;

В моем случае

СтрШапки="";
Если ВыбМатериал.Выбран()=1 Тогда  
  Если ВыбМатериал.ЭтоГруппа()=1 Тогда 
    ВыбГруппа=ВыбМатериал;
    ДобавитьУсловие(ТекстЗапроса,ВыбГруппа,"Группа","группе материалов",СтрШапки);
  Иначе	
    ДобавитьУсловие(ТекстЗапроса,ВыбМатериал,"Материал","материалу",СтрШапки);
  КонецЕсли;
КонецЕсли;
Если ВыбКонтрагент.Выбран()=1 Тогда  
  ДобавитьУсловие(ТекстЗапроса,ВыбКонтрагент,"Контрагент","контрагенту",СтрШапки);
КонецЕсли;


5. Формируем базовую таблицу

Вставляем вполне стандартный кусок, не забыв прежде определить переменную Т:

З=СоздатьОбъект("Запрос");
Если З.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Какая-то ошибка в запросе!");
Возврат;
КонецЕсли;
З.Выгрузить(Т,1,0);

Вот теперь стоит вспомнить, каких группировок не было в нашем запросе по каким-либо причинам и добавить их сейчас в таблицу. Делать это просто:

Если Помечен("ИМЯ_ГРУППИРОВКИ")=1 Тогда
Т.НоваяКолонка("ИМЯ_ГРУППИРОВКИ");
КонецЕсли;

Разумеется, эти новые колонки надо заполнить в цикле.

Функция «Помечен» должна быть определена выше. Она проверяет, была ли помечена в запросе та или иная группировка:

Функция Помечен(Имя)  
  Для К=1 по Группировки.РазмерСписка() Цикл
    ИмяГр=Группировки.ПолучитьЗначение(К);
    Если ИмяГр=Имя Тогда
      Возврат Группировки.Пометка(К);
    КонецЕсли;
  КонецЦикла;	
  Возврат 0;
КонецФункции // Помечен() 


В моем запросе не была определена одна переменная: «Сумма». Но это не группировка, поэтому я ее определяю без проверки:

Т.НоваяКолонка("Сумма","Число",15,2);
Т.ВыбратьСтроки();
Пока Т.ПолучитьСтроку()=1 Цикл
  Т.Сумма=Т.Цена*Т.Количество;
КонецЦикла;	


6. Формируем таблицы по выбранным пользователем группировкам

Еще раз поясню, что это такое. Представим, что в моем примере имеется отмеченными всего две группировки: «Заказчик» и «Материал». Тогда печатная форма отчета должна состоять из итоговых строк по заказчикам в разрезе материалов. Для этого мне потребуется всего две таблицы. Первая – это базовая таблица, сформированная по запросу, а вторая – таблица, построенная на основе базовой, данные в которой (сумма и количество израсходованных материалов) свернуты по заказчикам. Соответственно, при построении отчета, когда совершается обход строк основной таблицы, если в текущей строке заказчик изменился, то это означает, что необходимо вывести результирующую строку по новому заказчику и продолжать обход.

Нам потребуется массив размером, соответствующим размеру списка группировок.

Посчитаем число отмеченных группировок:

ГрВсего=0;
Для К=1 По Группировки.РазмерСписка() Цикл
  Если Группировки.Пометка(К)=0 Тогда
    Продолжить;
  КонецЕсли;   
  ГрВсего=ГрВсего+1;
КонецЦикла;	


Также нам необходима строка «СуммыГруппировок» для свертки таблиц и список выбранных пользователем группировок на форме отчета.

Формировать результирующие таблицы по группировкам будем в цикле. Сформированные таблицы поместим в архив.

СуммыГруппировки="Сумма,Количество";
Группируем="";
Сортируем="";
СписокГруппировок=СоздатьОбъект("СписокЗначений");
Л=0;
Для К=1 По Группировки.РазмерСписка() Цикл
  Если Группировки.Пометка(К)=0 Тогда
    Продолжить;
  КонецЕсли;   
  Л=Л+1;
  Зн=Группировки.ПолучитьЗначение(К,Стр);
  СписокГруппировок.ДобавитьЗначение(Зн);
  Заголов=Заголов+?(Заголов="",""," / ")+Стр;
  Группируем=Группируем+?(Группируем="","",",")+Зн;
  Сортируем=Сортируем+?(Сортируем="","+",",+")+Зн;
  Если Л<ГрВсего Тогда
    Арх[Л]=СоздатьОбъект("ТаблицаЗначений");
    Т.Выгрузить(Арх[Л],,,Группируем+","+СуммыГруппировки);
    Арх[Л].Свернуть(Группируем,СуммыГруппировки);
    Арх[Л].Сортировать(Сортируем);
  КонецЕсли;                                       
КонецЦикла;


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

Кстати, не забудем теперь сгруппировать и отсортировать саму базовую таблицу.

Т.Свернуть(Группируем,СуммыГруппировки);
Т.Сортировать(Сортируем);


Мы готовы к заключительному этапу.

7. Рисуем печатную форму.

При рисовании печатной форму стоит помнить, что пользователь должен все-таки тоже что-то увидеть, если он по глупости отметил сразу все возможные группировки. Для этого стоит выделять цветом или отступом итоговые строки.

В моем варианте шаблон таблицы выглядит вот так:



Особо внимательные, думаю, заметили, где используются сформированные ранее строки «СтрШапки» и «Заголов»

Также в начало модуля необходимо вынести определения переменных, используемых в строках. У меня это:

Перем СуммаВСтроке, КоличествоВСтроке;


8. Выводим таблицу на экран

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

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

Рассмотрим работу построителя отчета по индукции.

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

На каждой итерации цикла перед выводом значений по строке будем сравнивать значения реквизитов в строке таблицы с текущими значениями по каждой из группировок, с самой верхней до предпоследней. Если по какой-то из группировок под номером n значение изменилось, то выводим все секции таблицы, относящиеся к группировкам, начиная с этой, и до предпоследней. Новые значения по группировкам опять сохраняем.

В общем-то ничего сложного…

БылГр=СоздатьОбъект("СписокЗначений");

Таб=СоздатьОбъект("Таблица"); 
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");
МаксКолвоСекций=6; 
                                   
Гр="";
ТекГр=1;
Состояние("Постоентие таблицы ...");

Т.ВыбратьСтроки();
Пока Т.ПолучитьСтроку()=1 Цикл
  Для К=1 По ТекГр-1 Цикл
    Если ПроверитьГруппировку(Т,СписокГруппировок,БылГр,К)=0 Тогда
      ТекГр=К;
      Прервать;
    КонецЕсли;	
  КонецЦикла;
  Пока ТекГр<ГрВсего Цикл 
    СуммаГруппировки(Т,Арх[ТекГр],СписокГруппировок,ТекГр,ГрВсего);
    Гр=СписокГруппировок.ПолучитьЗначение(ТекГр,Стр);
    Инф=Т.ПолучитьЗначение(Т.НомерСтроки,Гр);
    Таб.ВывестиСекцию("Строка"+?(МаксКолвоСекций-ГрВсего>0,
      Строка(ТекГр+ МаксКолвоСекций -ГрВсего),ТекГр));
    ЗапомнитьГруппировку(Т,СписокГруппировок,БылГр,ТекГр);
    ТекГр=ТекГр+1;
  КонецЦикла;
  Гр=СписокГруппировок.ПолучитьЗначение(ТекГр,Стр);
  Инф=Строка(Т.ПолучитьЗначение(Т.НомерСтроки,Гр));
  СуммаГруппировки(Т,Т,СписокГруппировок,ТекГр,ГрВсего);
  Таб.ВывестиСекцию("Строка");
КонецЦикла;


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

Функция ПроверитьГруппировку(Т,СпГрупп,БылГр,ТекГр)
  Если ТекГр=0 Тогда
    Возврат 1;
  КонецЕсли;
  Если ТекГр>БылГр.РазмерСписка() Тогда
    Возврат 1;
  КонецЕсли;    
  Гр=СпГрупп.ПолучитьЗначение(ТекГр);
  Зн1=Т.ПолучитьЗначение(Т.НомерСтроки,Гр);
  Зн2=БылГр.ПолучитьЗначение(ТекГр);
  Если Зн1<>Зн2 Тогда
    БылГр.УстановитьЗначение(ТекГр,"явлопваптявлптбяват");
  КонецЕсли;
  Возврат ?(Зн1=Зн2,1,0);
КонецФункции // ПроверитьГруппировку(Т,БылГр,ТекГр)

Процедура ЗапомнитьГруппировку(Т,СпГрупп,БылГр,ТекГр)
  Гр=СпГрупп.ПолучитьЗначение(ТекГр);
  Зн=Т.ПолучитьЗначение(Т.НомерСтроки,Гр);
  Если ТекГр>БылГр.РазмерСписка() Тогда
    БылГр.ДобавитьЗначение(Зн);
  Иначе	
    БылГр.УстановитьЗначение(ТекГр,Зн);
  КонецЕсли;    
КонецПроцедуры //ЗапомнитьГруппировку(Т,БылГр,ТекГр)

Процедура СуммаГруппировки(Т,ТабГр,СпГрупп,ТекГр,КолГр)
  Если ТекГр=КолГр Тогда
    СуммаВСтроке=Т.ПолучитьЗначение(Т.НомерСтроки,"Сумма");
    КоличествоВСтроке=Т.ПолучитьЗначение(Т.НомерСтроки,"Количество");
  Иначе
    Гр=СпГрупп.ПолучитьЗначение(1);               
    Зн=Т.ПолучитьЗначение(Т.НомерСтроки,Гр);
    Поз=0;
    ТабГр.НайтиЗначение(Зн,Поз,Гр);
    Пока Поз<=ТабГр.КоличествоСтрок() Цикл
      Найд=0;
      Для К=2 По ТекГр Цикл
        Гр=СпГрупп.ПолучитьЗначение(К);
        Если ТабГр.ПолучитьЗначение(Поз,Гр)<>Т.ПолучитьЗначение(Т.НомерСтроки,Гр) Тогда
          Поз=Поз+1;
          Найд=1;
          Прервать;
        КонецЕсли;
      КонецЦикла;
      Если Найд=0 Тогда
        СуммаВСтроке=ТабГр.ПолучитьЗначение(Поз,"Сумма");
        КоличествоВСтроке=ТабГр.ПолучитьЗначение(Поз,"Количество");
        Прервать;
      КонецЕсли;
    КонецЦикла;
  КонецЕсли;
КонецПроцедуры 


Отчет готов!

С учетом того, что кроме отчета я успел позаниматься разминкой, поужинать и написать эту статью мне потребовалось около трех часов…

Отчет, который я создавал сейчас вместе с вами, и который может быть легко использован, как шаблон, можно скачать вот здесь: //infostart.ru/projects/1460/

Надеюсь, предложенная технология поможет моим коллегам систематизировать и сократить время на разработку отчетов...
36

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

Комментарии
Избранное Подписка Сортировка: Древо
1. Gendalf 27.11.07 05:24 Сейчас в теме
5. Формируем базовую таблицу

Вставляем вполне стандартный кусок, не забыв прежде определить переменную Т:

З=СоздатьОбъект("Запрос");
Если З.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Какая-то ошибка в запросе!");


Еще лучше... Сообщить ("Что-то не то!") Очень приятно когда тебе утром звонят и говорят приходи у нас "Что-то не то!"
стаья хорошая +
2. O-Planet 6974 27.11.07 05:27 Сейчас в теме
>> стаья хорошая +

Ставь!

(и еще один - за скромность этого моего комментария :) )
3. CheBurator 27.11.07 09:20 Сейчас в теме
Как всегда - я и здесь молчать не буду. Давайте доведем до логического конца описанный выше подход, а именно: разделим функционально "объекты":
- "объект" подготовки данных (сбор через запрос, выборкой и т.д.);
- "объект" вывода произвольных данных в виде таблицы с группировками (вертикальными/горизонтальными).
Свяжем эти 2 объекта соглашением о связях: на вход второго "объекта" (вывод данных) требуется передать ТЗ определенного вида, а именно: плоскую ТЗ произвольного вида и указания "группировочных" измерений и "ресурсов" (если зайти еще дальше, то группировочные измерения и ресурсы можно определять автоматически).
В результате получим "Универсальный отчет по ТЗ": http://infostart.ru/profile/174/projects/942/ и пример его использования: http://infostart.ru/projects/522/?&desc=1&ref=174.
Т.е. описанное в статье вполне можно было бы окончить на п.5 после оператора
З.Выгрузить(Т,1,0);

Каковы преимущества/недостатки "Универсального отчета по ТЗ" и решения Опланета? Они очевидны:
- решение автора более глубоко "привязано" к текущему алгоритму и за счет этого не так легко переносимо;
- "универсальный отчет по ТЗ" абсолютно автономен и встративается в качестве подсистемы вывода в любой отчет, поддерживающий "соглашение" о связях (если бы автор взял его, то написание отчета заняло бы гораздо меньше времени ;)
..но все имеет свою оборотную сторону: решение автора будет быстрее строить итоговый отчет, "универсальный отчет" в этом смысле - помедленнее, потому как самостоятельно фильтрует/строит таблицы-выборки, описывающие группировки.
.. но в итоге (судя по всему) суммарное время, затраченное на выбор данных и вывод итоговой таблицы будет примерно одинаковым... а универсальность и удобство - судить "пользователям".
4. JohnyDeath 294 27.11.07 10:40 Сейчас в теме
В очередной раз советую посмотреть в сторону 1с++ http://www.1cpp.ru/ и уже реализованных классов в том числе по группировкам, МФ и выводу в таблицу. Отличный набор классов вам дарит Лаборатория 33 http://33lab.ru/ и их конфа СКАТ: http://infostart.ru/projects/1149/
Другие классы можно найти или попросить на форуме 1с++ http://www.1cpp.ru/forum/YaBB.pl
Время создания подобных отчетов сокращается в разы!
5. CheBurator 27.11.07 10:49 Сейчас в теме
До тех пор, пока не будет внятного репозитария классов - да, ускоряется в разы, да хорошо... но! разгребать тонны чтобы понять/найти нужное - тяжко.. согласен - неповоротливый я... Документации ВНЯТНОЙ как не было - так и нет.
6. JohnyDeath 294 27.11.07 11:15 Сейчас в теме
Документации к чему? Если к 1с++, то вот тут: http://www.1cpp.ru/index.php/Documentation есть раздел "Online html документация", который изменяется при внесении каких-то доработок в 1cpp.dll. Если ты имел ввиду документацию к классам, то тут уж извини: если у автора класса есть время на подробное описание, то он это делает, если есть чуть-чуть времени, то он публикует основные вохможности класса и тестовый пример, ну а если вообще нет времени, то... его право, можно сказать спасибо хотя бы за то, что он это сделал и выложил.
П.С. ес-но, скриншотами мало кто балуется ;)
7. CheBurator 27.11.07 11:25 Сейчас в теме
(6) Про то и речь... все доки, которые я смотрел, представляют собой просто набор чего-то. Как чего-то близкого к понятию "документация" - нет... Про репозитарий - вообще молчу... (а то, что он "сделал и выложил" - не умаляя мастерства работающих на 1С++ - хз..чего он там наваял.. особенно если поленился доку приписать к классу).
8. O-Planet 6974 27.11.07 11:45 Сейчас в теме
Рябят, вы не о том. В конце концов, можно установить 1С++, купить КЗК, заказать новейший отчет и вообще перестать о чем-либо думать. Я писал для программистов, а не для копи-пастеров и драг-енд-дроперов. Цель статьи - ПРЕДЛОЖИТЬ МЕТОД и расмотреть его изнутри. А далее - все что угодно. Хотите - делайте свой "универсальный отчет", хотите - используйте чей-то, я же беру вот этот самый шаблон и быстренько переделываю под то, что мне надо. "неповоротливый я" :)
9. Abadonna 3833 27.11.07 11:56 Сейчас в теме
(8) Да никто и не спорит! Я, во всяком случае... "Мастер-класс" убери и нет вопросов ;)
15. JohnyDeath 294 27.11.07 12:12 Сейчас в теме
(8) >Я писал для программистов, а не для копи-пастеров и драг-енд-дроперов
улыбнуло ))
Т.е. ты считаешь, что если функционал разбит на классы, то человек, который это использует "драг-н-дропер" и копи-пастер??? А тот, кто прочитает твою статью, скопирует отсюда строки и вставит в своё - это настоящий программист???! :))))
10. O-Planet 6974 27.11.07 11:59 Сейчас в теме
Ты вот мыло лучше посмотри :)
11. brr 27.11.07 11:59 Сейчас в теме
12. O-Planet 6974 27.11.07 12:00 Сейчас в теме
[11] У Раруса фсе продукты интересные...
14. brr 27.11.07 12:06 Сейчас в теме
(12) Мне понравился механизм группировок с автоотступом
13. O-Planet 6974 27.11.07 12:06 Сейчас в теме
[10] Ха, это мне надо было мыло посмотреть ...
16. O-Planet 6974 27.11.07 12:33 Сейчас в теме
Да разбить на классы - не вопрос. Я по ходу об этом и пишу, кстати там же. Просто Ч. предлагает заменить целый кусок использованием независимой обработки. Это можно, без вопросов. Но тогда какой смысл писать статью? Надо просто публиковать ссылки, как он и сделал: возмем кусок оттуда, потом оттуда...
18. CheBurator 27.11.07 14:14 Сейчас в теме
(16) Не просто ссылки, а хотя бы мелкое, но содержательное описание как их "увязать" между собой... ;-)
17. sergiowood 2 27.11.07 13:40 Сейчас в теме
Такого рода статьи и примеры очень помогают при освоении механизмов построения отчетов в 1С, особенно начинающим или просто любителям бухам. которые пишут для оптимизации своего труда.
А ссылки «У Раруса есть интересный продукт http://www.rarus.ru/products/soft/126/», типа заплати и плыви, не каждому начинающему по карману.
СПАСИБО за статью и пример.
19. O-Planet 6974 03.12.07 15:24 Сейчас в теме
О! А я уж думал, что оно не нужно оказалось... :)
20. SAN 03.12.07 16:40 Сейчас в теме
Подобная методика используется в конфе "Заказчик строительства". Можешь посмотреть и сравнить. За статью - спасибо. Есть же энтузиасты..
Оставьте свое сообщение

См. также

Дистрибьюция 7.7. Часть 1. Жизненный цикл заявки покупателя. Одна заявка покупателя, много адресов доставки. 1

Статья Программист Нет файла v7.7 1С7:Комплекс 1С7:ТиС УУ Бесплатно (free) Практика программирования Адаптация типовых решений

Описан способ работы с учетом расписания с приоритетными покупателями - торговыми сетями (основными покупателями) в торговой или комплексной учетной системе на 1С 7.7. Множественная заявка покупателя на несколько торговых точек.

14.10.2019    486    ksnik    0       

Проверка часового пояса 9

Статья Программист Нет файла v7.7 Windows Бесплатно (free) Практика программирования

При использовании терминалок для удаленных баз, иногда при входе в базу данных необходимо исключить возможность входа пользователей с компьютеров с другим часовым поясом. Например, работают в Новосибирской базе с временем UTC +6 и пытаются зайти в базу с UTC +3.

16.05.2016    8150    kudenzov    3       

[ПОЛЕЗНЯШКА, 7.7] Как посчитать итоги по документам черным запросом с изподвывертом? 13

Статья Программист Нет файла v7.7 1cv7.md Windows Бесплатно (free) Практика программирования

Мелкая полезняшка, считает запросом итоговую сумму документов и количество документов.

12.03.2016    15458    CheBurator    18       

.Net в 1С. На примере использования HTTPClient, AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция 111

Статья Программист Нет файла v7.7 v8 Windows Бесплатно (free) Практика программирования WEB

Часто приходится парсить сайты, в том числе с авторизацией, перескакивая со страницы на страницу по ссылкам. Тот, кто занимался вэб программированием, знает, как удобно использовать JQuery и CSS селекторы. На .Net написана очень удобная библиотека AngleSharp. Я покажу, как с её помощью можно значительно облегчить себе труд.

10.03.2016    48316    Serginio    33       

.Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д. 37

Статья Программист Нет файла v7.7 v8 Windows Бесплатно (free) Практика программирования Разработка внешних компонент WEB

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

09.03.2016    25341    Serginio    22       

Использование классов .Net в 1С для новичков 147

Статья Программист Нет файла v7.7 v8 Windows Бесплатно (free) Практика программирования Разработка внешних компонент Универсальные функции

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    62708    Serginio    104       

Пример HTTP запроса к УТМ ЕГАИС на платформе 1С 7.7 15

Статья Программист Нет файла v7.7 1cv7.md Россия Windows Оптовая торговля Розничная торговля Бесплатно (free) Практика программирования Внешние источники данных

Запрос реализован на объекте ServerXMLHTTP из встроенной в Windows библиотеки MSXML, результатом запроса является XML объект DOMDocument из той же библиотеки MSXML со встроенным интерфейсом его обработки

16.12.2015    19953    Palmer1976    3       

Экспорт нескольких MXL таблиц в один XLS файл, на отдельные листы. Простой алгоритм 20

Статья Программист Нет файла v7.7 v8 Windows Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Статья посвящена распространённому вопросу - как сохранить несколько таблиц (отчетов) в формате MXL, с которым работает 1С, на отдельные листы одного Excel файла. Освещается простой алгоритм решения проблемы штатными средствами, без использования внешних модулей и библиотек (не относящихся к 1С и Excel).

23.11.2015    13926    etmarket    14       

Процедура расшифровки ячейки таблицы в отчетах 1С 7.7 11

Статья Программист Нет файла v7.7 1cv7.md Windows Бесплатно (free) Практика программирования Универсальные функции

Хочу поделиться с вами универсальной процедурой для расшифровки ячеек печатной формы отчетов в 1С 7.7.

24.09.2015    13757    Anzhey    13       

Универсальный способ сравнения таблиц 15

Статья Программист Нет файла v7.7 v8 Бесплатно (free) Практика программирования

На эту тему уже есть статьи, но этот способ нигде не описан. Хотя я его использую с тех пор, как занимаюсь программированием. Его преимущество в простоте и универсальности: можно применять на 1С, SQL, а также в любом другом языке программирования.

05.07.2015    14752    json    1       

Числа прописью в родительном падеже в 7.7? Легко! 13

Статья Программист Нет файла v7.7 1cv7.md Windows Бесплатно (free) Практика программирования

Вывод числительных прописью в родительном падеже штатными средствами в три строчки кода.

20.06.2015    10010    gimalaj    3       

Хитрости сохранения табличного документа в Excel для дальнейшей работы с ним 78

Статья Программист Нет файла v7.7 v8 1cv8.cf 1cv7.md Windows Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Все пользователи 1С всех версий (начиная с 7-й) сталкиваются с проблемой нормальной работы с данными, сохраненными в Excel файл. Есть некоторые хитрости, которые позволяют облегчить работу с сохраненными данными из 1С в формат Excel.

16.01.2015    70762    shmellevich    35       

Исправление в типовой комплексной конфигурации глобальной функции глВсеРеквизитыДокументаЗаполнены() 4

Статья Программист Нет файла v7.7 1С7:Комплекс Россия Windows Бесплатно (free) Практика программирования

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

20.08.2014    5972    hvv2002    0       

ЗаполнитьЗначенияСвойств - заставляем работать в 7.7 11

Статья Программист Нет файла v7.7 1cv7.md Бесплатно (free) Практика программирования

Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?

24.07.2014    18715    tomvlad    5       

Полезные функции. Склонение (должность и фамилия подписантов). Любой язык 3

Статья Программист Нет файла v7.7 v8 Windows Бесплатно (free) Практика программирования

Уехал директор в командировку, отпуск... , оставил доверенность на хозяйственные операции на другого сотрудника. Все договора и другие документы в обмороке - "подписант" теперь другой, по тексту тоже много правок... Пересмотрел много публикаций, вариантов много, не приглянулось. Сделал свой "Баян" . У меня всего-то крутится пять фигурантов ... Нет простого, наглядного и всепогодного варианта без языкового барьера. Всем процессом управляет пользователь.

03.03.2014    15307    kompas-dm    5       

Реализация Ctrl+Z в 1С 7.7 (ТиС) 7

Статья Программист Нет файла v7.7 1С7:ТиС Windows Бесплатно (free) Практика программирования

В семерке отсутствует возможность отменять последнее действие в формах документов. В данной статье будет рассмотрен пример реализации данной функции. Возможно, кому-нибудь пригодится.

15.07.2013    5516    a.o.popova    10       

Быстрый поиск в справочниках по наименованию, с использованием svcsvc.dll 12

Статья Программист Нет файла v7.7 1cv7.md Windows Бесплатно (free) Поиск данных Универсальные обработки Работа с интерфейсом

По аналогии с http://infostart.ru/public/14286/, недавно узнал что в svcsvc.dll несколько обновился функционал, в частности был добавлен метод AddString(). В прилагаемом коде показан запрос, реализованный методами ВК 1SQlite, т.е. только для DBF. Это только пример. Т.е. если например у справочника отсутствует поле "Наименование", то скорее всего будет ошибка. Тем не менее критика приветствуется))) Необходимые ВК: 1SQlite, FORMEX, svcsvc.dll (отсюда: http://www.1cpp.ru/forum/YaBB.pl?num=1373266553). p.s. Спасибо огромное уважаемому ADirks за все эти прекрасные плюшки, и помощь в их освоении)))

12.07.2013    125684    unichkin    10       

Копия напечатанного документа или как спрятать документ. 2

Статья Программист Нет файла v7.7 Бесплатно (free) Журнал регистрации Практика программирования

Возникла необходимость, чтобы при печати определённого документа (даже потом не сохранённого), создавалась его копия, т.е. запись всех напечатанных документов. (В результате чего возникла такая потребность, полагаюсь на вашу фантазию). В итоге получилось два варианта решения, остановился на втором.

11.04.2013    13084    Dima_    8       

Автосохранение документа в 1С 7.7 3

Статья Программист Нет файла v7.7 1cv7.md Россия Windows Бесплатно (free) Практика программирования

В данной статье мы рассмотрим автосохранение документа в 1С 7.7!

22.03.2013    11038    aagubarev    25       

Конвертация данных 2.1 (2.1.3.1) 1С 7.7 - 1С 8.Х передача параметра ПКО 14

Статья Системный администратор Программист Нет файла v7.7 v8 КД Бесплатно (free) Практика программирования Перенос данных из 1С7.7 в 1C8.X

Передача параметров по умолчанию доступна только для баз 1С 8.х -1С 8.х. Показан пример, как передать параметры из 1С 7.7 - 1С 8.х

10.12.2012    22157    serg_gres    6       

Устранение проблемы при работе с полем, которое ограничено маской ввода 3

Статья Программист Нет файла v7.7 1cv7.md Россия Бесплатно (free) Практика программирования

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

08.08.2012    14112    www2000    4       

Динамическая фильтрация в справочнике при вводе наименования 15

Статья Программист Нет файла v7.7 1cv7.md Россия Бесплатно (free) Практика программирования

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

02.07.2012    14212    maxpiter    62       

Мини-класс для непосредственного ввода в элементах диалога V7.7 51

Инструменты и обработки Программист Внешняя обработка (ert,epf) v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free) Работа с интерфейсом

Класс основан на баге платформы 7.7, является продолжением публикации http://infostart.ru/public/140861/ позволяет искать по наименованию в реквизитах типа справочник "а-ля снеговик".

26.06.2012    18299    139    Ёпрст    87       

Обновление базы 1с 7.7. с помощью движка 1с 8.х 92

Статья Системный администратор Программист Нет файла v7.7 1cv7.md Россия Бесплатно (free) Практика программирования Администрирование данных 1С

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

28.04.2012    15840    Valerich    31       

v77. Робот 43

Инструменты и обработки no Внешняя обработка (ert,epf) v7.7 1cv7.md Россия Бесплатно (free) Практика программирования

Исполнитель Робот. Учебное пособие по программированию для детей дошкольного возраста. Без внешних компонент.

09.04.2012    10161    54    item    18       

Запуск внешней обработки по расписанию v7.7 39

Статья Программист Нет файла v7.7 1cv7.md Россия Windows Бесплатно (free) Практика программирования Администрирование данных 1С

Неоднократно возникали задачи организовать, например ежедневную выгрузку и отправку отчетов по эл.почте, и вот…

20.03.2012    39467    Yury1001    17       

v77. Закладки в многоуровневом справочнике аля Total Commander 28

Инструменты и обработки Программист Конфигурация (md, cf) v7.7 1cv7.md Россия Бесплатно (free) Практика программирования

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

09.03.2012    8793    44    item    17       

v77. Паинт 53

Инструменты и обработки Программист Внешняя обработка (ert,epf) v7.7 1cv7.md Россия Бесплатно (free) Практика программирования

v77. 1С:Паинт :) Такая вот игрушка. Без внешних компонент.

06.03.2012    11878    81    item    38       

Как уменьшить количество заблокированных объектов 26

Статья Программист Нет файла v7.7 1cv7.md Россия Бесплатно (free) Практика программирования

История о том как я решил пересобрать форму справочника клиентов и чем это все закончилось...

12.01.2012    13174    ShEvOvIcH    18       

Регистрация текста окна сообщений 4

Статья Программист Нет файла v7.7 1cv7.md Россия Бесплатно (free) Практика программирования

Для контроля работы пользователей потребовалось записывать текст окна сообщений в файл. Получился простейший механизм регистрации лог-файла. Удержать роста папки "Temp", в качестве рекомендации, может использование bat-файла, который будет чистить или архивировать получаемые логи. Таких батников в инете полным-полно. P.S. Особо по форуму не смотрел, может, есть уже такое.

28.11.2011    6342    sdin101    9       

7.7.: Готовим md-файл для публикации. В картинках. 46

Статья Программист Нет файла v7.7 1cv7.md Россия Бесплатно (free) Практика программирования

Вы доработали типовую конфигурацию: скажем, добавили новый Документ, и хотите им поделиться с обществом ИС. Но нельзя же выложить МД-шник целиком, это будет нарушением правил. И как тут быть?

14.09.2011    15022    Арчибальд    21       

Учет доверенностей 6

Статья Программист Нет файла v7.7 1С7:Бух 1С7:Комплекс 1С7:ТиС 1С7:ПУБ Документооборот и делопроизводство Бесплатно (free) Практика программирования

В расходных документах есть необходимость проставления доверенности. Но заносить каждый раз одни и те же данные бывает утомительно. особенно при больших оборотах.

08.09.2011    9541    Sykoku    8       

Выбор Движений документа по конкретному регистру, с помощью прямого запроса 0

Инструменты и обработки Программист Конфигурация (md, cf) v7.7 openconf 1cv7.md Россия Бесплатно (free) Практика программирования

Чтобы узнать какие движения сделал документ по конкретному регистру, в моем случае это регистр "ОстаткиПоСчетам" (оборотный), была написана следующая функция в глобальном модуле. Работает только для SQL версии и установленной внешнй компонентой 1С++!

26.05.2011    10514    Vix    4       

Прямой запрос на выборку подчиненных документов 6

Инструменты и обработки Программист Конфигурация (md, cf) v7.7 openconf 1cv7.md Россия Бесплатно (free) Практика программирования

Иногда необходимо получить список или таблицу документов, подчиненных выбранному. Для этого в глобальном модуле была написана функция с прямым запросом на выборку подчиненных документов. Работает только в SQL версии и при установленной внешней компоненте 1С++ !

26.05.2011    16832    Vix    5       

Некоторые ошибки и «проблемные» особенности реализации встроенного языка платформы 1С:Предприятие 7.7 96

Статья Программист Нет файла v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free) Практика программирования

Описание некоторых ошибок и особенностей реализации встроенного языка, которые создают «подводные камни» при программировании, а также возможных способов обхода этих проблем из собственного опыта работы на платформе 1С:Предприятие 7.7.

08.04.2011    41995    AleksR    102       

Монопольно ли запущена база 7.7 для SQL. Снятие single user в sql 9

Статья Системный администратор Программист Нет файла v7.7 openconf 1cv7.md Россия Бесплатно (free) Информационная безопасность Практика программирования

T-SQL скрипт, позволяющий определить монопольно ли запущена база на сервере SQL, а также перевести базу в multi user

11.03.2011    16402    d0dger    12       

Ошибки формата файла 2-НДФЛ в ЗиК релиз 306 100

Статья Программист Нет файла v77::Расчет 1С7:ЗиК Россия НУ Зарплата НДФЛ Бесплатно (free) Практика программирования

Ошибки 2НДФЛ в релизе: файл формируется как для ЮЛ, даже если работодатель ИП, опечатка "Отчетсвто", и указание имени файла с расширением. Нужно подправить отчет "СправкиПоНДФЛ".

02.02.2011    17092    1st    6       

ЗиК 305 ЗиК 306 Больничный лист. 107

Статья Программист Нет файла v77::Расчет 1С7:ЗиК Россия Зарплата Бесплатно (free) Практика программирования

Для переходящих больничных листов за счет работодателя оплачивается 2 дня, а не 3. Первоисточник: http://forums.kuban.ru/forum/viewtopi...669&page=2

25.01.2011    12189    Cvetic    26