7.7 Подсчет количества проведенных документов (1С 7.7)

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

  1. TopicStarter Overlay
    alienz
    Offline

    alienz

    Регистрация:
    7 июн 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Добрый день.
    Я делаю в 1С 7.7 ИС для работы аэропортов, аэрофлота и т.п.
    У меня есть справочник рейс (реквизиты - ИзГорода, ВГород, ДатаОтправки, КоличествоМест)
    Есть документ Билет (реквизиты - Пассажир, ЦенаБилета, НомерБилета, Рейс)

    Как мне сделать чтобы считалось количество свободных мест?
    Тобишь чтобы считалось сколько всего проведенных документов на тот или иной рейс, и из Справочник.Рейс.КоличествоМест отнималось количество проведенных документов.
  2. volodya1122
    Offline

    volodya1122 Опытный в 1С

    Регистрация:
    25 фев 2011
    Сообщения:
    96
    Симпатии:
    1
    Баллы:
    26
    Выбирайшь документы (период указываешь например "год назад" по текущую дату). функцией Проведен() проверяешь проведен ли документ. И если проведен то ищешь в нем реквизит нужный "Рейс". Суммируешь все проданные билеты в котором есть нужный рейс (если для одного пассажира резервируется только одно место). Вот и будет количество зарезервированных билетов
  3. TopicStarter Overlay
    alienz
    Offline

    alienz

    Регистрация:
    7 июн 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Не могли бы вы написать кодом? Я просто не очень хорошо разбираюсь в 1С.
  4. rshakiro
    Offline

    rshakiro Профессионал в 1С Команда форума

    Регистрация:
    17 мар 2011
    Сообщения:
    2.236
    Симпатии:
    144
    Баллы:
    104
    Заведите регистр, документами вносите записи в регистр, запросом можно получить нужные Вам данные... Писать запрос к документам не самая лучшая идея...
  5. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    [off]
    Извините[/off]
  6. volodya1122
    Offline

    volodya1122 Опытный в 1С

    Регистрация:
    25 фев 2011
    Сообщения:
    96
    Симпатии:
    1
    Баллы:
    26
    Я так понял из описания задачи- это не реальный заказ, а всего лишь студенческая работа.. Для Аэрофлота это как-то мелковато.
    Вот по быстрому прикинул "кодом" как это примерно должно выглядить то что я написал выше.
    Хотя для реального решения то как ты придумал не годится.
    Код:
    КоличествоБилетов=0;					 
    Нужныйрейс=РеквизитДркументаНаКоторомСейчасДелаешьНовыйБилет; 
    Дата1=НачГода(НачГода(ТекущаяДата())-1);// начало прошлого года
    Док=СоздатьОбъект("Документ.Билет");
    Док.ВыбратьДокументы(Дата1,ТекущаяДата());
    Пока Док.ПолучитьДокумент()=1 Цикл
    Если Док.Проведен()=1 Тогда
    Если Док.Рейс=Нужныйрейс тогда
    КоличествоБилетов=КоличествоБилетов+1;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    СвободныхМест=Нужныйрейс.КоличествоМест-КоличествоБилетов; 
  7. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не совсем так. Алгоритм не учитывает промежуточные точки. Если рейс А-Б, то подойдет. Но если будет А-Б-В.... думаю посчитает не правильно.

    Полностью согласен...
  8. TopicStarter Overlay
    alienz
    Offline

    alienz

    Регистрация:
    7 июн 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    А-Б-В не нужно. Да, это просто студенческая работа.
  9. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда лучше через регистры. Оборотные. Учитываем что один и тот же рейс повторяется с периодичностью.
  10. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    про регистр в условии ничего не сказано, судя по всему справочник уже заменяет регистр, т.к. есть дата отправки
    [1ccode]
    Функция ВертнутьКолВоЗанятыхМест(СсылкаНаРейс,ДатаНаКоторуюСмотримИлиДокумент)

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с '01.01.1999' по ДатаНаКоторуюСмотримИлиДокумент;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |Билет = Документ.Билет.ТекущийДокумент;
    |Рейс = Документ.Билет.Рейс;
    |Условие(Рейс в СсылкаНаРейс);
    |"//}}ЗАПРОС
    ;
    Результат = СоздатьОбъект("ТаблицаЗначений");
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат 0;
    КонецЕсли;
    Запрос.Выгрузить(Результат);
    Возврат Результат.КоличествоСтрок();
    КонецФункции

    Процедура СообщитьКолвоСвободныхМест()
    Рейсы = СоздатьОбъект("Справочник.Рейсы");
    Рейсы.ВыбратьЭлементы();
    Пока Рейсы.ПолучитьЭлемент() = 1 Цикл
    КоличествоЗанятыхМест = ВертнутьКолВоЗанятыхМест(Рейсы.ТекущийЭлемент(),ТекущаяДата());
    Сообщить("На рейс "+Рейсы.ТекущийЭлемент() +" осталось "+(Рейсы.КоличествоМест - КоличествоЗанятыхМест) + " свободных мест");
    КонецЦикла;

    //Если смотрим при создании нового билета, то
    //по идее так: КоличествоЗанятыхМест = ВертнутьКолВоЗанятыхМест(РейсыТекущийЭлемент,ТекущийДокумент()),
    //ну и цикл по эл-там не нужен. Описанная конструкция например для использования в отчетах;
    КонецПроцедуры[/1ccode]
    теги поменялись, не знаю как сейчас код включать
  11. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    ["code1c"] ["/code1c"] без кавычек соответственно.... + есть кнопка "код 1с"
  12. TopicStarter Overlay
    alienz
    Offline

    alienz

    Регистрация:
    7 июн 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Взял ваш код, выводило ошибку, исправил, но не считало, еще исправил, опять ошибка)))
    Я прикрепил проект, посмотрите пожалуйста что я не так делаю. Документ билет.

    Вложения:

  13. volodya1122
    Offline

    volodya1122 Опытный в 1С

    Регистрация:
    25 фев 2011
    Сообщения:
    96
    Симпатии:
    1
    Баллы:
    26
    Ты не указал, что реквидиты документа находятся в разделе "Реквизиты табличной части"
    Вот исправил твой отчет "КоличествоСвободныхБилетов". Как сделать тоже самое в документе думаю догадаешся

    Код:
    Процедура Сформировать()
    КоличествоБилетов=0;
    Нужныйрейс=ВыбРейс;
    Дата1=НачГода(НачГода(ТекущаяДата())-1);// начало прошлого года
    Док=СоздатьОбъект("Документ.Билет");
    Док.ВыбратьДокументы(Дата1,ТекущаяДата());
    Пока Док.ПолучитьДокумент()=1 Цикл
    Если Док.Проведен()=1 Тогда
    док.выбратьстроки();
    пока Док.получитьстроку()=1 цикл
    Если Док.Рейс=Нужныйрейс тогда
    КоличествоБилетов=КоличествоБилетов+1;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    СвободныхМест=Нужныйрейс.КоличествоМест-КоличествоБилетов;
    сообщить(СвободныхМест);
    КонецПроцедуры
    Хотя названия рейсов у тебя повторяются. тогда лучше заменить
    Док.Рейс на Док.Рейс.Код
    и
    Нужныйрейс=ВыбРейс заменить на Нужныйрейс=ВыбРейс.Код

    Теперь что в первую очередь бросается в глаза, на что твой преподаватель обезательно обратит внимания.
    1. Ты задал в одном документе "Былет" возможность задать несколько строк (тоисть на несколько человек один билет). Небуду спорить хорошо или плохо это. Но в твоем билете есть возможность выписать один билет, например двум пассажирам на два разные рейса. Как они будут делить этот билет. Поэтому название рейса лучше сделать в Шапке.
    2. Цена билета. Лучше сзазу указать цену билета в справочнике.Рейсы. Чтобы для каждого былета не вспоминать сколько стоит билет на тот или другой рейс.
  14. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Угу... Но ведь существует понятие бизнес класса и эконом класса. Тогда уж привязывать цену к номеру места в салоне.
  15. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    да, предполагалось что у билета нет табличной части (один билет = одно место). Если будет ТЧ с несколькими строками - тогда считать еще количество строк..
    вся реализация такой конфы минут на 30
  16. TopicStarter Overlay
    alienz
    Offline

    alienz

    Регистрация:
    7 июн 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    А как можно сделать чтобы в табличную часть можно было только одну строку добавить?

    И еще: нужно сделать бронирование билетов - получается будет еще 2 документа - 1) бронирование 2) отказ от бронирования , следовательно код будет изменен на такой:

    Код:
    
    
    Нужныйрейс=Рейс;
    Дата1=НачГода(НачГода(ТекущаяДата())-1);// начало прошлого года
    Док=СоздатьОбъект("Документ.Билет");
    ДокБронь=СоздатьОбъект("Документ.Бронирование");
    ДокОтказ=СоздатьОбъект("Документ.Отказ");
    Док.ВыбратьДокументы(Дата1,ТекущаяДата());
    Пока Док.ПолучитьДокумент()=1 Цикл
    Если Док.Проведен()=1 Тогда
    док.выбратьстроки();
    пока Док.получитьстроку()=1 цикл
    Если Док.Рейс=Нужныйрейс тогда
    КоличествоБилетов=КоличествоБилетов+1;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    
    
    
    ДокБронь.ВыбратьДокументы(Дата1,ТекущаяДата());
    Пока ДокБронь.ПолучитьДокумент()=1 Цикл
    Если ДокБронь.Проведен()=1 Тогда
    докбронь.выбратьстроки();
    пока ДокБронь.получитьстроку()=1 цикл
    Если ДокБронь.Рейс=Нужныйрейс тогда
    КоличествоБилетов=КоличествоБилетов+1;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    
    
    ДокОтказ.ВыбратьДокументы(Дата1,ТекущаяДата());
    Пока ДокОтказ.ПолучитьДокумент()=1 Цикл
    Если ДокОтказ.Проведен()=1 Тогда
    докотказ.выбратьстроки();
    пока ДокОтказ.получитьстроку()=1 цикл
    Если ДокОтказ.Рейс=Нужныйрейс тогда
    КоличествоБилетов=КоличествоБилетов-1;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    
    СвободныхМест=Нужныйрейс.КоличествоМест-КоличествоБилетов;
    
    
    
    Все правильно?
  17. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Ну в принципе... да. Но есть большое НО
    1) При проведении бронирования, отказа, самого бедета есть ли проверка на состояние этого места. Т.е можно дважды забронировать одно и то же место и забронировать уже проданное место по билету.
    2) Зачем плодить массу документов когда можно ввести в шапку документа реквизит ВидОперации (ну скажем типа перечисление) и все делать в "одном флаконе"
    3) Нужно все же делать через регистры... Иначе от проблем описанных в п.п. 1 вы не избавитесь.
  18. volodya1122
    Offline

    volodya1122 Опытный в 1С

    Регистрация:
    25 фев 2011
    Сообщения:
    96
    Симпатии:
    1
    Баллы:
    26
    Если нужно только одно значение в билете, то можно или програмно запретить создавать больше одной строки (проверкой на количество строк в документе), или все реквизиты табличной части перенести в "реквизиты шапки". и таким образом вообще избавится от табличной части (в этом случае будет актуальна та проверка которую я написал в самом начале).
    С такими темпами написания своей работы ты неуспеешь к концу учебного года.....
  19. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Так человек-то не профи, а только учится

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