7.7 Cумма строк

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем ИгорьШпак, 9 апр 2012.

  1. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Люди, если вам не сложно ибо так будет понятнее и быстрее, не могли бы вы мне обяснить поэтапно как создать группу со списком пункта 4 и подсчитать ее сумму?
    Спасибо

    сейчас все выложу
    Спасибо
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Без знания структуры БД так и будите топтаться на месте... Один аллах ведает что там. М.б. это подчиненный справочник или еще что.
    Выложите МДшник. Телепатов здесь нет
  3. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Люди добрые, а как Мдшник вам показать? Что выложить? Просто файл с мд расширением??? А также что еще вы бы хотели ? Просто я новичек, а дали задание огого какое для такого уровня(((
    Спасибо
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Да. Файл 1cv7.md на любой файлообменник, а сюда ссылку.
  5. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    я уже спросил, к сожалению не разрешают(((( единственное я могу все описать лагически итд. Извиняюсь за это((
  6. NovInNik
    Offline

    NovInNik Опытный в 1С

    Регистрация:
    12 ноя 2007
    Сообщения:
    195
    Симпатии:
    1
    Баллы:
    29
    вот незадача. Тогда описывайте все по порядку. А лучше создайте документ (например в Word-e) чтобы не занимать здесь особо место. Все по порядку распишите что откуда (желательно со скринами и модулями).
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Других вариантов просто нет...
    Готовый код без структуры создать невозможно... Но общий принцип такой:

    1) Цикл по справочнику статей потребления. Определяем состав групп ( в теле запроса сделать не реально из-за специфического формата хранения) Я так понял состав статьи состоит из кодов элементов этого же справочника. Разделителем служит "+". Маразм... Чего уж проще было бы сделать через родителя....
    Все вышеупомянутое хозяйство выгружаем в ТЗ (для отчета) и СЗ (для запроса)
    2) Выполняем запрос по фондам потребления с учетом СЗ.
    3) Результат консолидируем в ТЗ постатейно...
    4) Вывели отчет. Для вывода нужной вам информации по группировкам придется создавать дополнительный цикл....
    Судя по скриншоту отчет уже есть... Не выводит только итог по группам.

    Сам отчет выложить то сможите?
  8. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Уважаемые господа, я сейчас пишу документ в котором постараюсь изложиться, но для меня что посоветовали Вы - Бухгалтерский угодник, я думаю пока это сложнова-то. Скоро постараюсь выложить
    Спасибо
  9. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Вот док файл
    Спасибо

    Вложения:

  10. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    что касается кода там смысла нет выкладывать, его лучше обяснить логически если надо. Просто там много лишнего для решения данного вопроса да и на мой взгляд он тупой какой-то((
    Если все же понадобиться - то могли бы вы мне обяснить как перекопировать код в какой-нить текстовый файл?
    Путем выделить все-копировать-вставить ... копирует всякие иероглифы( кодировка видимо
  11. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    да из v7 код просто так не копирнешь....

    что касается файла, справочник, на который опирается док, остается таким же, или вы все кардинально хотите поменять?
  12. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    По сути структура таже, как говорил раньше - будут добавленны и удалены некоторые наименования, как с которых складывается результат так и сами те что выводят результат. Справочник и док будут впринципе оч похожи, но все же другими. Я просто потом сам попробую сделать то что мне нужно будет , а пока мне надо реализовать сложение, вычитаение наименований самым автоматизированным способо. Надеюсь я более или менее понятно написал.. Хотя может и нет((
  13. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    спрошу по другому. Это будет новая конфигурация с новым справочником и доками или внутри уже существующей ведется допиливание?
  14. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    ))))) Спасибо за любезность. Очень благодарен! Это будет новый справочник, новый документ, вобщем все по новому. Просто можно брать что-то из прошлого либо впринципе целиком, но я хочу написать все по новому и улучшенно чтоб было. Дабы понять больше и чтоб качественней.
    Спасибо
  15. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    тогда пробуйте с группами работать, думаю более автоматизировано будет, меньше рукопашного

    я с 7 не работала, потому примеры кода не могу подсказать, посмотрите в книге В.Дубянского Конфигурирование и администрирование для начинающих, там есть примеры, что не понятно будет, спрашивайте...
  16. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    что касается групп, то лучше больше их от руки сделать и меньше кода но как(((
  17. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Перед копированием в 1С убедитесь, что у вас установлена русская раскладка, иначе в буфер текст уже попадает кракозябрами...
  18. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а справочник у вас иерархический? тогда просто Создать группу наверное
  19. TopicStarter Overlay
    ИгорьШпак
    Offline

    ИгорьШпак

    Регистрация:
    9 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    ООО спс ща код выложу

    Код:
    Перем СтрХ, СловоХ; // переменные для дробления строки на слова по пробелам. В СтрХ заносим строку (до вызова функции),в - СловоХ получаем результат
    //*************************************
    Функция СледующееСлово() // функция для дробления строки на слова (разделитель - пробел)
    СтрХ = СокрЛП(СтрХ);
    Позиц = Найти(СтрХ, " ");
    Если Позиц > 0 Тогда
    СловоХ = Лев(СтрХ, Позиц-1);
    СтрХ = СокрЛП(Сред(СтрХ, Позиц));
    ИначеЕсли (Позиц = 0) И (СтрДлина(СтрХ) > 0) Тогда
    СловоХ = СтрХ;
    СтрХ = "";
    Иначе
    Возврат(0);
    КонецЕсли;
    Возврат(1);
    КонецФункции //СледующаяСтрока()
    //*************************************
    Функция ПроверкаУникальностиДок(Дат)
    Док = СоздатьОбъект("Документ." + Вид());
    Док.ВыбратьДокументы(НачМесяца(Дат), КонМесяца(Дат));
    Пока Док.ПолучитьДокумент() = 1 Цикл
    Если (Док.ПометкаУдаления() = 0) И (Док.ТекущийДокумент() <> ТекущийДокумент()) И
    (Док.Филиал = Филиал) Тогда //Если уже есть документ
    Если Вопрос("В данном месяце уже есть введенный документ """ + ПредставлениеВида()+ """!"
    "Документ находится в журнале """ + ПредставлениеВида()+ """!"
    "Редактируйте его или пометьте документ на удаление!"
    "Открыть его для редактирования?", 4) = 6 Тогда
    Попытка
    ОткрытьФорму(Док.ТекущийДокумент(),,0);
    Исключение
    Предупреждение("Данная операция недопустима! Закройте текущий документ и откройте необходимый из журнала!");
    КонецПопытки;
    КонецЕсли;
    Возврат(0);
    ИначеЕсли (ДатаМесяц(Док.ДатаДок) = ДатаМесяц(Дат)) И
    (Док.ПометкаУдаления() = 1) И (Док.ТекущийДокумент() <> ТекущийДокумент()) И
    (Док.Филиал = Филиал) Тогда //Если уже есть документ, но он помечен на удаление
    Если Вопрос("В этом месяце уже есть помеченный на удаление документ """ + ПредставлениеВида()+ """!"
    "Удалить помеченный на удаление документ?", 4) = 6 Тогда
    Док.Удалить(1);
    Иначе
    Возврат(0);
    КонецЕсли;
    
    КонецЕсли;
    КонецЦикла;
    Возврат (1);
    КонецФункции // ПроверкаУникальностиДок(Дат)
    //*************************************
    Функция АктуальностьЭлемента(Элем)
    ДатаНач = Элем.ДатаНач; // Если в справочнике заполнены дата ввода данной строки, или дата "удаления" ее из работы,
    ДатаКон = Элем.ДатаКон; // то проверяем актуальность, т.е. должна ли быть указанная строка в доке для данной даты
    Если (ПустоеЗначение(ДатаНач) = 1) И (ПустоеЗначение(ДатаКон) = 1) Тогда
    Возврат(1);
    ИначеЕсли (ПустоеЗначение(ДатаНач) = 0) И (ПустоеЗначение(ДатаКон) = 0) И
    (ДатаДок >= ДатаНач) И (ДатаДок <= ДатаКон) Тогда
    Возврат(1);
    ИначеЕсли (ПустоеЗначение(ДатаКон) = 1) И (ДатаДок >= ДатаНач) Тогда
    Возврат(1);
    ИначеЕсли (ПустоеЗначение(ДатаНач) = 1) И (ДатаДок <= ДатаКон) Тогда
    Возврат(1);
    Иначе
    Возврат(0);
    КонецЕсли;
    КонецФункции // АктуальностьЭлемента(Элем)
    //*************************************
    Функция СуммаСтрок(СписСтр) //Служит для суммирования в строку под индексом НомСуммСтр(при работе 1С) строк,
    СпрП = СоздатьОбъект("Справочник.СтатьиПотребления");
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    СуммаСтрок = 0;
    ВыгрузитьТабличнуюЧасть(ТЗ);
    СтрХ = СокрЛП(СписСтр); //Если первый символ слова "+" суммирует, Если "-" то отнимает.
    Пока СледующееСлово() = 1 Цикл
    ПервСимвол = Лев(СловоХ, 1);
    НомерКода = Число(Сред(СловоХ, 2));
    СпрП.НайтиПоКоду(НомерКода);
    НомСтр = 0; НомКол = 0;
    Если ТЗ.НайтиЗначение(СпрП.ТекущийЭлемент(), НомСтр, НомКол) = 0 Тогда //ищем строку со значением
    // Сообщить("Не найдена строка с элементом " + СокрЛП(СпрП.ТекущийЭлемент())+"! Обратитесь к администратору!");
    Продолжить;
    КонецЕсли;
    ПолучитьСтрокуПоНомеру(НомСтр);
    Если ПервСимвол = "+" Тогда
    СуммаСтрок = СуммаСтрок + Месяц;
    ИначеЕсли ПервСимвол = "-" Тогда
    СуммаСтрок = СуммаСтрок - Месяц;
    ИначеЕсли ПервСимвол = "/" Тогда
    СуммаСтрок = ?(Месяц = 0, 0, СуммаСтрок / Месяц); // не допускаем деление на 0
    ИначеЕсли ПервСимвол = "*" Тогда
    СуммаСтрок = СуммаСтрок * Месяц;
    КонецЕсли;
    КонецЦикла; //Пока СледующееСлово()
    Возврат СуммаСтрок;
    КонецФункции // СуммаСтрок(НомСуммСтр, СписСтр)
    //*************************************
    Процедура ПересчетКол()
    Если (СокрЛП(Показатель) = "Остаток на конец") Тогда
    Нарастающий = Месяц; // ну равны они здесь, равны...
    ИначеЕсли (СокрЛП(Показатель) <> "Остаток на начало") // остаток на начало не меняется с начала года,
    И (СокрЛП(Показатель) <> "Наличие средств ФП всего") // Наличие средств ФП всего считаем "по-своему"
    И (СокрЛП(Показатель) <> "Списочная численность в среднем, чел.")
    И (Найти(Показатель, "ФП на 1 чел.") <> 1) Тогда // здесь все вручную
    Нарастающий = Месяц + ПредыдущийМесяц; // а здесь мы суммируем все оставшееся
    КонецЕсли;
    КонецПроцедуры // ПересчетКол()
    //*************************************
    Процедура ПересчетСтрок()
    НарастФН = 0;
    Для А = 1 По КоличествоСтрок() Цикл // Предупреждение! Через ВыбратьСтроки работать корректно не будет, т.к. в процессе будет перепозиционирование
    ПолучитьСтрокуПоНомеру(А);
    // \/*** Далее расчитываем нарастающий для "Наличие средств ФН всего"
    Если (А >= 1) И (А <= 4) Тогда // суммируем нарастающий из 1-4 строки
    НарастФН = НарастФН + Нарастающий;
    ИначеЕсли А = 5 Тогда // в 5-й строке хранится "Наличие средств ФН всего"
    Нарастающий = НарастФН; // устанавливаем рассчитанную сумму
    КонецЕсли; // Если (А >
    // /\*** здесь расчитываем нарастающий для "Наличие средств ФН всего"
    Если Показатель.Автозаполнение = Перечисление.Булево.Да Тогда
    Если СокрЛП(Показатель.СписокСтрок) = "" Тогда
    Продолжить;
    КонецЕсли; // если пусто, то не пересчитываем и соответственно заполнять пользователю не даем (это для Остатков сделано)
    СписСтр = Показатель.СписокСтрок;
    СуммаСтрок = СуммаСтрок(СписСтр);
    ПолучитьСтрокуПоНомеру(А); // нужно позиционироваться заново. Выводим значение в нужную строку
    Месяц = СуммаСтрок;
    ПересчетКол();
    КонецЕсли;
    
    // \/ *** Эта "затычка" считает ФП на 1 чел.
    // Запоминаем
    Если СокрЛП(Показатель) = "Итого расход" Тогда
    РасходН = Нарастающий;
    КонецЕсли;
    Если СокрЛП(Показатель) = "Итого расход без ссуд, тыс. руб." Тогда
    БезСсудН = Нарастающий;
    КонецЕсли;
    Если СокрЛП(Показатель) = "Списочная численность в среднем, чел." Тогда
    ЧислН = Нарастающий;
    КонецЕсли;
    // заносим
    Если СокрЛП(Показатель) = "ФП на 1 чел. Всего, тыс.руб." Тогда
    Нарастающий = ?(Число(ЧислН) = 0, 0, РасходН / ЧислН);
    КонецЕсли;
    Если СокрЛП(Показатель) = "ФП на 1 чел. без ссуд, тыс.руб." Тогда
    Нарастающий = ?(Число(ЧислН) = 0, 0, БезСсудН / ЧислН);
    КонецЕсли;
    // /\ *** Эта "затычка" считает ФП на 1 чел.
    КонецЦикла; // Для А
    КонецПроцедуры // ПересчетСтрок()
    //*************************************
    Процедура ЗапретРедактирования()
    Если (Форма.ТекущаяКолонка() = "Нарастающий")
    И (СокрЛП(Показатель.Наименование) <> "Списочная численность в среднем, чел.") Тогда
    Предупреждение("Данная колонка заполняется автоматически!" +
    "Исключение - ""Списочная численность в среднем, чел.""!", 2);
    ПересчетКол();
    КонецЕсли;
    КонецПроцедуры // ЗапретРедактирования()
    //*************************************
    Процедура ПриВводеСтроки()
    СтатусВозврата(0); //Не позволяем вносить новые строки
    КонецПроцедуры //ПриВводеСтроки()
    //*************************************
    Процедура ПриУдаленииСтроки()
    СтатусВозврата(0); //Не позволяем удалять строки
    КонецПроцедуры
    //*************************************
    Процедура ПриИзмененииПорядкаСтрок()
    СтатусВозврата(0); //Не позволяем перемещать строки
    КонецПроцедуры
    //*************************************
    Процедура ПриНачалеРедактированияСтроки()
    Если Показатель.Автозаполнение = Перечисление.Булево.Да Тогда
    Предупреждение("Данная строка заполняется автоматически суммированием последующих данных!"
    "Т.е. редактируйте последующие строки!");
    СтатусВозврата(0);
    КонецЕсли;
    
    Если (Форма.ТекущаяКолонка() = "Нарастающий")
    И (СокрЛП(Показатель.Наименование) <> "Списочная численность в среднем, чел.") Тогда
    Предупреждение("Данная колонка заполняется автоматически!" +
    "Исключение - ""Списочная численность в среднем, чел.""!", 3);
    СтатусВозврата(0);
    КонецЕсли;
    КонецПроцедуры
    //*************************************
    Процедура ПриОкончанииРедактированияСтроки()
    ПересчетСтрок();
    ПересчетСтрок(); // два раза, т.к. некоторые строки зависят друг от друга
    Форма.Обновить();
    КонецПроцедуры // ПриОкончанииРедактированияСтроки()
    //*************************************
    Функция ПолучитьПредыдущийДок(Дат)
    Нач = НачМесяца(ДобавитьМесяц(Дат,-1)); //отнимаем по месяцу, т.к. данные заполняются по прошедшему месяцу
    Кон = КонМесяца(ДобавитьМесяц(Дат,-1));
    Док = СоздатьОбъект("Документ." + Вид());
    Док.ВыбратьДокументы(Нач, Кон);
    Пока Док.ПолучитьДокумент() = 1 Цикл
    Если (Филиал = Док.Филиал)
    И (Док.ПометкаУдаления() = 0) // помеченные не рассматриваем
    И (ПустоеЗначение(Филиал) = 0) Тогда //Если это док нужного парка, за прошлый месяц
    Возврат (Док.ТекущийДокумент()); // документ, с которого мы будем рассчитывать нарастающий итог
    КонецЕсли;
    КонецЦикла;
    Возврат(0);
    КонецФункции //ПолучитьПредыдущийДок(Дат)
    //*************************************
    Функция ОстатокНачГода()
    Док = ПолучитьПредыдущийДок(НачГода(ДатаДок));
    Если ТипЗначенияСтр(Док) = "Документ" Тогда //Если есть последний (декабрьский) документ за прошлый год
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл
    Если СокрЛП(Док.Показатель) = "Остаток на конец" Тогда
    Возврат(Док.Нарастающий);
    КонецЕсли;
    КонецЦикла;
    Иначе
    Сообщить("Для данного документа не обнаружено документа """ + ПредставлениеВида() + """ за декабрь предыдущего года!", "!");
    Возврат(0);
    КонецЕсли;
    КонецФункции // ОстатокНачГода()
    //*************************************
    Процедура НарастИтог()
    ТЗПред = СоздатьОбъект("ТаблицаЗначений"); //Таблица, заполняется данными предыдущего документа
    Док = ПолучитьПредыдущийДок(ДатаДок);
    ФлагНетПредДока = 0; // обнуляем
    Если ДатаМесяц(ДатаДок) = 1 Тогда //Если это первый месяц, то не суммируем
    ФлагНетПредДока = 1; //т.е. это перый месяц
    ИначеЕсли Док = 0 Тогда //Если это не первый документ года, но для него не найдено предшественника
    Сообщить("Данные по нарастающему итогу могут быть не верными!", "!");
    Сообщить("Для данного документа не обнаружено документа """ + ПредставлениеВида() + """ за предыдущий месяц!", "!");
    Сигнал();
    ФлагНетПредДока = 1;
    ИначеЕсли ТипЗначения(Док) = 12 Тогда // Если это документ
    Док.ВыгрузитьТабличнуюЧасть(ТЗПред);
    КонецЕсли; //Если ПолучитьПредыдущийДок(ДатаДок)
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
    Если СокрЛП(Показатель) = "Остаток на начало" Тогда // в первую строку заносим по другому алгоритму
    Нарастающий = ОстатокНачГода(); // просто переносим из прошлого года
    ПредыдущийМесяц = 0;
    НомСтр = 0; НомКол = 0;
    Если ФлагНетПредДока = 1 Тогда
    Месяц = Нарастающий; // т.е. вначале года (или если нет предыдущего) берем за остаток - остаток на начало года
    ИначеЕсли ТЗПред.НайтиЗначение(Формат("Остаток на " + НачМесяца(ДатаДок), "С100"), НомСтр, НомКол) = 1 Тогда
    ТЗПред.ПолучитьСтрокуПоНомеру(НомСтр); // выбираем строку остатка на конец месяца, откуда мы берем остаток на начало
    Месяц = ТЗПред.Нарастающий;
    КонецЕсли; // ФлагНетПредДока = 1
    Продолжить;
    КонецЕсли;
    
    Если ФлагНетПредДока = 0 Тогда
    НомСтр = 0; НомКол = 0;
    ТЗПред.НайтиЗначение(Показатель, НомСтр, НомКол);
    Если НомСтр <> 0 Тогда
    ТЗПред.ПолучитьСтрокуПоНомеру(НомСтр);
    ПредыдущийМесяц = ТЗПред.Нарастающий; // привязываемся к реквизиту, а не к номеру колонки
    КонецЕсли; // Если НомСтр
    Иначе
    ПредыдущийМесяц = 0;
    КонецЕсли;
    ПересчетКол(); // пересчитываем нарастающий
    КонецЦикла; // Пока ПолучитьСтроку()
    // \/*** Далее расчитываем нарастающий для "Наличие средств ФП всего"
    НарастФП = 0;
    Для А = 1 По 4 Цикл
    ПолучитьСтрокуПоНомеру(А);
    НарастФП = НарастФП + Нарастающий;
    КонецЦикла;
    ПолучитьСтрокуПоНомеру(5); // в 5-й строке хранится "Наличие средств ФП всего"
    Нарастающий = НарастФП;
    КонецПроцедуры //НарастИтог()
    //*************************************
    Процедура ВыборФилиала() // в управлении (где не установлена Константа Филиал) придется вводить пару филиалов. Для этого данная процедура и служит
    Если (ПустоеЗначение(Константа.Филиал) = 0) И (Филиал <> Константа.Филиал) Тогда
    Предупреждение("Вы можете вносить документ только за " + Константа.Филиал + РазделительСтрок +
    "В случае необходимости, попросите Администратора системы заменить Константу ""Филиал""!");
    Филиал = Константа.Филиал;
    ИначеЕсли (ПустоеЗначение(Филиал) = 1) Тогда
    Предупреждение("Необходимо ввести филиал!");
    Иначе // все нормально, т.е. и филиал выбран допустимо
    Если ПроверкаУникальностиДок(ДатаДок) = 0 Тогда
    Филиал = Перечисление.Филиал.ЗначениеПоИдентификатору(Префикс(НомерДок));
    Возврат;
    КонецЕсли;
    СтрПреф = СокрЛП(Филиал.Идентификатор())+"_";
    //Номер документа содержит информацию о номере парка и дате создания дока. В дате имеется смещение на 1 месяц назад, т.к. он заполняется за прошлый месяц. Т.е. в июне за май и т.п.
    НомерДок = СтрПреф + Формат(ДатаЧисло(ДатаДок), "Ч(0)2.0") + "_" + Формат(ДатаМесяц(ДатаДок), "Ч(0)2.0") + "_" + Сред(ДатаГод(ДатаДок),3); //Устанавливаем номер документа с указанием номера парка, даты, месяца и года
    СтрЗаголовок = "" + Филиал + " за " + Формат(ДатаДок, "ДММММГГГГ");
    НарастИтог(); // действия те же что и на вводе
    КонецЕсли;
    КонецПроцедуры // ВыборФилиала()
    //*************************************
    Процедура ВводНового()
    ДатаДок = ДобавитьМесяц(ДатаДок, -1);
    Филиал = Константа.Филиал;
    Если ПроверкаУникальностиДок(ДатаДок) = 0 Тогда
    СтатусВозврата(0);
    Возврат;
    КонецЕсли;
    СтрПреф = СокрЛП(Филиал.Идентификатор())+"_";
    //Номер документа содержит информацию о номере парка и дате создания дока. В дате имеется смещение на 1 месяц назад, т.к. он заполняется за прошлый месяц. Т.е. в июне за май и т.п.
    НомерДок = СтрПреф + Формат(ДатаЧисло(ДатаДок), "Ч(0)2.0") + "_" + Формат(ДатаМесяц(ДатаДок), "Ч(0)2.0") + "_" + Сред(ДатаГод(ДатаДок),3); //Устанавливаем номер документа с указанием номера парка, даты, месяца и года
    СтрЗаголовок = "" + Филиал + " за " + Формат(ДатаДок, "ДММММГГГГ");
    СпрП = СоздатьОбъект("Справочник.СтатьиПотребления");
    СпрП.ПорядокКодов();
    СпрП.ВыбратьЭлементы();
    Пока СпрП.ПолучитьЭлемент() = 1 Цикл
    Если (АктуальностьЭлемента(СпрП.ТекущийЭлемент()) = 0) // неактуальный
    Или (СокрЛП(СпрП.Наименование) = "") Тогда // пустая (зарезервированная строка)
    Продолжить; // выводим только актуальные
    КонецЕсли;
    НоваяСтрока();
    Показатель = СпрП.ТекущийЭлемент();
    Если СокрЛП(Показатель) = "Остаток на начало" Тогда
    СтрПоказатель = "Остаток на " + НачМесяца(ДатаДок);
    ИначеЕсли СокрЛП(Показатель) = "Остаток на конец" Тогда
    СтрПоказатель = "Остаток на " + НачМесяца(ДобавитьМесяц(ДатаДок, 1));
    ИначеЕсли СокрЛП(Показатель.Наименование) = "" Тогда
    СтрПоказатель = "";
    ИначеЕсли СокрЛП(Показатель) = "Расходы по статьям" Тогда
    СтрПоказатель = " Расходы по статьям";
    ИначеЕсли (Найти(Показатель, "*") <> 0) И (Найти(Показатель, "справочно") <> 0) Тогда
    СтрПоказатель = " справочно";
    Иначе
    СтрПоказатель = Строка(Показатель);
    КонецЕсли; // Если СокрЛП(Показатель)
    НомерСтр = Показатель.НомерСтр;
    
    КонецЦикла;
    НарастИтог();
    ПересчетСтрок();
    КонецПроцедуры //ВводНового()
    //*************************************
    Процедура ПриОткрытии()
    Если Проведен() = 1 Тогда // чтоб случайно очумелые ручки не поменяли филиал
    Форма.Филиал.Доступность(0);
    КонецЕсли;
    Цвет = 1;
    КонецПроцедуры //ПриОткрытии()
    //*************************************
    Процедура СохранитьФайл()
    Если Проведен() = 0 Тогда
    Предупреждение("Для сохранения необходимо вначале провести документ!");
    Возврат;
    КонецЕсли;
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ВыгрузитьТабличнуюЧасть(ТЗ);
    ТЗ.НоваяКолонка("Код", "Число", 5, 0); // дублирующая информация по элементу справочника Показатель
    ТЗ.НоваяКолонка("Наименование", "Строка", 100); // дублирующая информация по элементу справочника Показатель. Наименование почти что совпадает с СтпПоказатель. Но... Именно, почти что. Есть отличия уже по 3-м строкам, а дальше - больше. Т.е. 4 Кб на файл - это не такой и большой минус (шлем 1 раз в месяц)
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    ТЗ.Код = ТЗ.Показатель.Код; // записываем в строки таблицы наименование и код (т.е. если ссылка на элемент не найдется в управлении, то можно будет найти по коду и наименованию)
    ТЗ.Наименование = СокрЛП(ТЗ.Показатель.Наименование); // не найти ссылку можно, если в филиале удалялись, добавлялись элементы справочника, т.е. внутреннее представление элемента отличается от внутреннего представления в управлении
    КонецЦикла; // Пока
    
    Ответ = Вопрос("""Да"" - Сохранить на дискете!"
    """Нет"" - Сохранить на диске в каталоге ""С\Файлы фондов""!"
    """Отмена"" - не сохранять!", 3);
    Если Ответ = 6 Тогда
    Попытка
    Каталог = "A:\Файлы фондов\";
    ИмяФайла = СокрЛП(НомерДок) + ".fnp";
    Если ФС.СуществуетФайл(Каталог) = 0 Тогда
    ФС.СоздатьКаталог(Каталог);
    КонецЕсли;
    
    Если ЗначениеВФайл(Каталог + ИмяФайла, ТЗ) = 1 Тогда
    Сообщить("Файл успешно записан! Каталог ""A:\Файлы фондов\""");
    Сообщить("Далее Вам следует отправить файл: """ + ИмяФайла + """ в управление (не сжимая, не переименовывая и т.п.)!");
    Иначе
    Предупреждение ("Вставте дискету в дисковод!");
    КонецЕсли;
    Исключение
    Предупреждение ("Вставте дискету в дисковод!");
    КонецПопытки;
    ИначеЕсли Ответ = 7 Тогда
    Каталог = "C:\Файлы фондов\";
    ИмяФайла = СокрЛП(НомерДок) + ".fnp";
    Если ФС.СуществуетФайл(Каталог) = 0 Тогда
    ФС.СоздатьКаталог(Каталог);
    КонецЕсли;
    Если ЗначениеВФайл(Каталог + ИмяФайла, ТЗ) = 1 Тогда
    Сообщить("Файл успешно записан! Каталог ""С:\Файлы фондов\""");
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры // СохранитьФайл()
    //*************************************
    Функция Проверка(Режим = 0) //Режим - режим проверки, если 1 выдает сообщения об ошибках пользователю, если 0 - возвращает признак, что есть ошибка
    Для А = 1 По КоличествоСтрок() Цикл // Предупреждение! Через ВыбратьСтроки работать корректно не будет, т.к. в процессе будет перепозиционирование
    ПолучитьСтрокуПоНомеру(А);
    Если (Показатель.Автозаполнение = Перечисление.Булево.Да)
    И (СокрЛП(Показатель.СписокСтрок) <> "") Тогда
    СписСтр = Показатель.СписокСтрок;
    СуммаСтрок = СуммаСтрок(СписСтр);
    ПолучитьСтрокуПоНомеру(А); // нужно позиционироваться заново. Выводим значение в нужную строку
    Если (Окр(Месяц) <> Окр(СуммаСтрок)) Тогда
    Если Режим = 1 Тогда
    Сообщить("Ошибка суммы строк в строке: " + СокрЛП(Показатель) +"!");
    КонецЕсли;
    Возврат(0);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла; // Для А
    Возврат (1);
    КонецФункции //Проверка()
    //*************************************
    Процедура КонтрольныйВыстрел()
    ПересчетСтрок(); // Пересчитываем еще раза, т.к. некоторые строки состоят из суммы строк, сами которые зависят от суммы других. Просто далее сэкономим время на пересчете с проверками, т.к. проверка тоже занимает время
    А = 0; // Служит счетчиком, чтоб не повесить систему (т.е. вечный цикл)
    Пока Проверка(0) = 0 Цикл // Т.к. есть формулы, которые пересекаются, т.е. один параметр зависит от другого, то возможно понадобиться несколько раз выполнить пересчет
    А = А + 1;
    ПересчетСтрок();
    Если А >= 5 Тогда
    Прервать; //5 пересчетов не помогло - выходим
    КонецЕсли;
    КонецЦикла;
    Если (Проверка(1) = 1) Тогда //Сообщаем результаты проверки, т.е. или выведет "ОК" или проблемные строки
    Сообщить("Данные верны!");
    КонецЕсли;
    КонецПроцедуры // КонтрольныйВыстрел()
    //*************************************
    Процедура Печать()
    ОткрытьФормуМодально("Обработка.ПодписьДокумента");
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    НомерМесяца = ДатаМесяц(ДатаДок);
    Если НомерМесяца = 1 Тогда
    СтрДоп = "" + ДатаГод(ДатаДок) + " года";
    ИначеЕсли НомерМесяца < 5 Тогда
    СтрДоп = " и " + СокрЛП(НомерМесяца) + " месяца " + ДатаГод(ДатаДок) + " года";
    Иначе
    СтрДоп = " и " + СокрЛП(НомерМесяца) + " месяцев " + ДатаГод(ДатаДок) + " года";
    КонецЕсли;
    СтрЗаглав = Сред(СтрЗаголовок, 1 , СтрДлина(СокрЛП(СтрЗаголовок)) - 4) + СтрДоп; // -5 т.к. мы отрезаем год
    Таб.ВывестиСекцию("Шапка");
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
    Если ((Показатель.Автозаполнение = Перечисление.Булево.Да)
    Или (СокрЛП(Показатель.НомерСтр) <> ""))
    И (Найти(Показатель, "*") = 0) Тогда // это для строки Справочно, которая выводится не жирным
    Таб.ВывестиСекцию("СтрокаЖыр");
    Иначе
    Таб.ВывестиСекцию("Строка");
    КонецЕсли;
    КонецЦикла;
    Должность = ВосстановитьЗначение("ДолжностьПодписьДок"); //восстанавливаем сохраненные значения
    Фамилия = ВосстановитьЗначение("ФамилияПодписьДок");
    Должность1 = ВосстановитьЗначение("ДолжностьПодписьДок1");
    Фамилия1 = ВосстановитьЗначение("ФамилияПодписьДок1");
    Должность2 = ВосстановитьЗначение("ДолжностьПодписьДок2");
    Фамилия2 = ВосстановитьЗначение("ФамилияПодписьДок2");
    Таб.ВывестиСекцию("Подвал");
    Таб.Опции(0,0,3,0);
    Таб.ПараметрыСтраницы(1,,,15,5,5,5,0,0,1);
    Таб.Показать("Печатная форма документа " + ПредставлениеВида());
    КонецПроцедуры //Печать()
    //*************************************
    Процедура ОК()
    Если ПустоеЗначение(Филиал) = 1 Тогда
    Предупреждение("Необходимо выбрать Филиал! Иначе сохранять нельзя!");
    Возврат;
    КонецЕсли;
    НарастИтог();
    КонтрольныйВыстрел();
    Записать();
    Провести();
    Форма.Филиал.Доступность(0);
    КонецПроцедуры //ОК()
    //*************************************
    Процедура Редактирование()
    ОткрытьФорму("Обработка.РедактироватьТаблДока", Контекст);
    Форма.Обновить();
    КонецПроцедуры // Редактирование()
    //*************************************
    Процедура ПриЗаписи()
    Если ПустоеЗначение(Филиал) = 1 Тогда
    Предупреждение("Необходимо выбрать Филиал! Иначе сохранять нельзя!");
    СтатусВозврата(0);
    КонецЕсли;
    КонецПроцедуры // ПриЗаписи()
    //*************************************
    //**//**//** Здесь начинаются функции, основанные на использовании компоненты по расширению возможностей формы
    Функция ПроверитьВид()
    Если Цвет = 1 Тогда
    Если ТипЗначенияСтр(Показатель) = "Справочник" Тогда // Просто строки, а не элементы справочника будут желтыми и у них нет Перечисление.Булево.Да
    Если Показатель.Автозаполнение = Перечисление.Булево.Да Тогда
    Возврат "BRUSH["+ПолучитьЦвет(230,255,214)+"]";
    Иначе
    Возврат "BRUSH["+ПолучитьЦвет(214,230,255)+"]";
    КонецЕсли;
    Иначе
    Возврат "BRUSH["+ПолучитьЦвет(220,220,255)+"]";
    КонецЕсли;
    Иначе
    Возврат "BRUSH["+ПолучитьЦвет(255,255,255)+"]";
    КонецЕсли;
    КонецФункции //ПроверитьВид()
    //*************************************
    Функция ПроверитьВид1() // для колонки нарастающего итога
    Если Цвет = 1 Тогда
    Если ТипЗначенияСтр(Показатель) = "Справочник" Тогда // Просто строки, а не элементы справочника будут желтыми и у них нет Перечисление.Булево.Да
    Если Показатель.Автозаполнение = Перечисление.Булево.Да Тогда
    Возврат "BRUSH["+ПолучитьЦвет(230,255,214)+"]";
    Иначе
    Возврат "BRUSH["+ПолучитьЦвет(255,230,214)+"]";
    КонецЕсли;
    Иначе
    Возврат "BRUSH["+ПолучитьЦвет(220,220,255)+"]";
    КонецЕсли;
    Иначе
    Возврат "BRUSH["+ПолучитьЦвет(255,255,255)+"]";
    КонецЕсли;
    КонецФункции //ПроверитьВид1()
    //*************************************
    Процедура ПослеОткрытия()
    ФормаРасш = СоздатьОбъект("РасширениеФормы");
    ФормаРасш.РаскрашиватьТаблицу("МногострочнаяЧасть");
    ФормаРасш.Обновить();
    КонецПроцедуры //ПослеОткрытия()
    //*************************************

    Одно скажу, мне как человеку не знающему 1с - тяжело выполнить данное задание, но ведь надо
  20. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    если для вас это разовое задание и в дальнейшем вы с 1с в плане программирования работать не будете, то может и не стоит замарачиваться? а обратиться к спецам?

Поделиться этой страницей