Группа: Пользователи
Сообщений: 38
Спасибо сказали: 0 раз
Рейтинг: 0
Добрый день! 1С 7.7, конфигурация не типовая. Есть документ Инвентаризация и отчет инвентаризационная опись. До этого клиенты пользовались отчетом Инвентаризационная опись, там идет отбор по Мол и Подразделениям. а теперь надо, чтобы они пользовались документом Инвентаризация, там тоже есть отбор, но когда сравниваешь данные по отчету и документу, выходит, что данных в документе больше. Не совсем пойму, откуда он берет эти данные. Вот отчет Инвентаризационная опись, выходит как полагается, опись идет только по основным средствам
Вот документ Инвентаризация, по материалам выходит все нормально, а по ОС выходят пустые строки, хотя они не сидят у этого сотрудника
Вот код отчета, кнопка сформировать
Процедура СформироватьОС() Стр=0; ИтогБалСтоим=0;
Если ПроверкаПериодаОтчета(ДатаНач,ДатаКон)=1 Тогда Возврат; КонецЕсли;
Пока СпрОС.ПолучитьЭлемент()=1 Цикл Если СпрОС.ЭтоГруппа()=1 Тогда продолжить; КонецЕсли; Если МОЛ.Выбран()=1 Тогда Если (СпрОС.МОЛ.Получить(Дата2)<>МОЛ) и (СпрОС.МОЛ.Получить(Дата2).Родитель<>МОЛ) Тогда продолжить; КонецЕсли; КонецЕсли; Если Подразделение.Выбран()=1 Тогда Если (СпрОС.Подразделение.Получить(Дата2)<>Подразделение) и (СпрОС.Подразделение.Получить(Дата2).Родитель<>Подразделение) и (СпрОС.Подразделение.Получить(Дата2).Родитель.Родитель<>Подразделение) и (СпрОС.Подразделение.Получить(Дата2).Родитель.Родитель.Родитель<>Подразделение) Тогда Продолжить; КонецЕсли; КонецЕсли; Если СпрОС.ПометкаУдаления()=1 Тогда продолжить; КонецЕсли; __эл=СпрОС.ТекущийЭлемент(); __пер.ИспользоватьОбъект("ПризнакНачисленияАмортизации",__эл); __пер.ВыбратьЗначения('01.01.1950',ДатаКон); Если __пер.ПолучитьЗначение()=0 Тогда продолжить; КонецЕсли; Если __пер.ДатаЗнач>Дата2 Тогда продолжить; КонецЕсли; Ит.ВыбратьСубконто(); Если Ит.ПолучитьСубконто(,,СпрОС.ТекущийЭлемент())=1 Тогда ОС=СпрОС.ТекущийЭлемент();
Если КоличествоСтрок()>0 Тогда Если вопрос("Существующая табличная часть будет очищена и заполнена заново! Продолжить?",4)<>6 Тогда возврат; КонецЕсли; КонецЕсли;
Если Фл_Мат_ОС_Ном<>1 Тогда Если Склад.Выбран()=0 Тогда Предупреждение("Не выбран склад!"); возврат; КонецЕсли; КонецЕсли;
би=СоздатьОбъект("БухгалтерскиеИтоги"); би.ИспользоватьПланСчетов(ВыбратьПланСчетов(ДатаДок)); счета=СоздатьОбъект("СписокЗначений"); Если Константа.НовыйПланСчетов.Получить(ДатаДок)=Перечисление.Булево.Нет Тогда сч=СоздатьОбъект("Счет.Казахстан"); Иначе сч=СоздатьОбъект("Счет.МСФОКазахстан"); КонецЕсли; сч.ВыбратьСчета(); Пока сч.ПолучитьСчет()=1 Цикл Если сч.ЭтоГруппа()=1 Тогда продолжить; КонецЕсли; Если Фл_Мат_ОС_Ном=0 Тогда Если Константа.НовыйПланСчетов.Получить(ДатаДок)=Перечисление.Булево.Нет Тогда Если (число(Лев(сч.Код,3))>=201) и (число(Лев(сч.Код,3))<=208) Тогда счета.ДобавитьЗначение(сч.ТекущийСчет()); КонецЕсли; Иначе Если (число(Лев(сч.Код,3))=131) или (число(Лев(сч.Код,4))=1351) Тогда счета.ДобавитьЗначение(сч.ТекущийСчет()); КонецЕсли; КонецЕсли; ИначеЕсли Фл_Мат_ОС_Ном=1 Тогда Если Константа.НовыйПланСчетов.Получить(ДатаДок)=Перечисление.Булево.Нет Тогда Если ((число(Лев(сч.Код,3))>=121) и (число(Лев(сч.Код,3))<=125)) или ((число(Лев(сч.Код,3))>=131) и (число(Лев(сч.Код,3))<=134)) Тогда счета.ДобавитьЗначение(сч.ТекущийСчет()); КонецЕсли; Иначе Если число(Лев(сч.Код,2))=24 Тогда счета.ДобавитьЗначение(сч.ТекущийСчет()); КонецЕсли; КонецЕсли; ИначеЕсли Фл_Мат_ОС_Ном=2 Тогда Если Константа.НовыйПланСчетов.Получить(ДатаДок)=Перечисление.Булево.Нет Тогда Если (число(Лев(сч.Код,3))>=221) и (число(Лев(сч.Код,3))<=223) Тогда счета.ДобавитьЗначение(сч.ТекущийСчет()); КонецЕсли; Иначе Если (число(Лев(сч.Код,3))=132) или (число(Лев(сч.Код,3))=133) или (число(Лев(сч.Код,4))=1352) Тогда счета.ДобавитьЗначение(сч.ТекущийСчет()); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла;
Если Фл_Мат_ОС_Ном=0 Тогда би.ИспользоватьСубконто(ВидыСубконто.Материалы); Если Склад.Выбран()=1 Тогда би.ИспользоватьСубконто(ВидыСубконто.МестаХранения,Склад); КонецЕсли; ИначеЕсли Фл_Мат_ОС_Ном=1 Тогда би.ВключатьСубсчета(-1,-1); би.ВключатьСубсчета(1); би.ИспользоватьСубконто(ВидыСубконто.ОсновныеСредства); Если Подразделение.Выбран()=1 Тогда би.ИспользоватьСубконто(ВидыСубконто.Подразделения,Подразделение, 2); КонецЕсли; Если МОЛ.Выбран()=1 Тогда би.ИспользоватьСубконто(ВидыСубконто.Сотрудники,МОЛ, 2); КонецЕсли; ИначеЕсли Фл_Мат_ОС_Ном=2 Тогда би.ИспользоватьСубконто(ВидыСубконто.Номенклатура); Если Склад.Выбран()=1 Тогда би.ИспользоватьСубконто(ВидыСубконто.МестаХранения,Склад); КонецЕсли; КонецЕсли;
би.ВыполнитьЗапрос(ДатаДок,ДатаДок,счета); би.ВыбратьСубконто(); Пока би.ПолучитьСубконто(,ТМЦ)=1 Цикл Если Фл_Мат_ОС_Ном=0 Тогда НоваяСтрока(); ИнвНомер=би.Субконто().Карточка; ТМЦ=би.Субконто(); БКоличество=би.СКД("К"); БСумма=би.СКД("С"); ИначеЕсли Фл_Мат_ОС_Ном=1 Тогда би.ВыбратьСчета(); Пока би.ПолучитьСчет()=1 Цикл ОСы.НоваяСтрока(); ОСы.ОС=би.Субконто(); ОСы.Сумма=би.СКД("С");//-би.СКК("С"); КонецЦикла; ИначеЕсли Фл_Мат_ОС_Ном=2 Тогда НоваяСтрока(); ИнвНомер=би.Субконто().Код; ТМЦ=би.Субконто(); БКоличество=би.СКД("К"); БСумма=би.СКД("С"); КонецЕсли; состояние(""+НомерСтроки+" "+ТМЦ); КонецЦикла;
Если Фл_Мат_ОС_Ном=1 Тогда ОСы.Свернуть("ОС","Сумма"); ОСы.Сортировать("ОС+"); ОСы.ВыбратьСтроки(); ЕстьПустые=0; Пока ОСы.ПолучитьСтроку()=1 Цикл Если ОСы.ОС.Выбран()=0 Тогда ЕстьПустые=1; продолжить; КонецЕсли; НоваяСтрока(); ИнвНомер=ОСы.ОС.НомерИК; ТМЦ=ОСы.ОС; БКоличество=1; БСумма=ОСы.Сумма; КонецЦикла; //Если ЕстьПустые=1 Тогда // Сообщить("Есть остатки по пустому значению вида субконто ""Основные средства""!","!"); //КонецЕсли; КонецЕсли;
Группа: Пользователи
Сообщений: 38
Спасибо сказали: 0 раз
Рейтинг: 0
Цитата(Домовик @ 14.04.14, 17:01)
кроме этих отчетов есть какие-то стандартные отчеты, типа оборотно-сальдовой ведомости?
маленькое изображение документа. не видно ОС, по кот нулевая сумма, и есть ли это ОС в отчете.
Да, оборотно-сальдовая ведомость есть, как и в типовой 7.7, В отчете выходят как раз те ОС, которые на определенном сотруднике. А в документ выходят еще и другие ос, которые записаны под другого сотрудника, но без суммы.
потому-что ошибка где-то есть. учитесь отладчиком пользоваться. и со временем найдете.
там схема такая: в зависимости от условий назначается одно из субконто, список счетов, потом выполяется запрос к остаткам.
Потом перебираются результаты запроса по второму виду субконто. Но в случае ОС почему-то еще используется ВыбратьСчета() - внутри цикла еще перебор счетов.
часто используется схема вроде этой:
Ит.ВыбратьСчета(); Пока Ит.ПолучитьСчет() = 1 Цикл Ит.ВыбратьСубконто(1); Пока Ит.ПолучитьСубконто(1) = 1 Цикл Ит.ВыбратьСубконто(2); Пока Ит.ПолучитьСубконто(2) = 1 Цикл
добавить нужные проверки по счетам и видам субконто и нулей бы не было. а так - нужно проверять отладчиком - что автор кода хотел перебором счетом внутри цикла отследить.
Владимир, Vofka, убиваете меня ограничением редактирования. ).
Сообщение отредактировал Домовик - 15.04.14, 11:27
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!