Имя: Пароль:
1C
1С v8
Регистр Накопления ЗаказыПоставщикам
,
0 ColonelAp4u
 
09.12.14
12:38
Подскажите как сделать правильный расход в регистре? Вот код движения
Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.ЗаказыПоставщикам.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.ЗаказПоставщику = ДокументОснование;
        Движение.СтатусПартии = "Купленный";
        Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
        Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры;
        Движение.Цена = ТекСтрокаТовары.Цена;
        Движение.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
        Движение.Количество = ТекСтрокаТовары.Количество;

    КонецЦикла;
В документе расхода товара может быть больше чем в приходе но отнять из регистра он же должен тоже что и приход?
1 Жан Пердежон
 
09.12.14
12:39
попробуй остаки сначала получить....
2 shuhard
 
09.12.14
12:43
(0)[В документе расхода товара может быть больше чем в приходе но отнять из регистра он же должен тоже что и приход?
]
да
нет
возможно
3 ColonelAp4u
 
09.12.14
12:44
(2) вообще не понятен ваш ответ
4 pessok
 
09.12.14
12:45
скопируй движения из ПТиУ
5 ColonelAp4u
 
09.12.14
12:46
Допустим ЗаказПоставщику Сделал движение приход 5 шт чего-то а переместили 10 шт он же не должен из регистра отнять 10 а всего лишь 5
6 Alex S D
 
09.12.14
12:48
Заказ - это план, перемещение - это факт. По моему ты чего-то путаешь
7 ColonelAp4u
 
09.12.14
12:51
(6) Факт фактом а разве не должно с регистра уйти именно столько сколько было по плану? просто это розница и тут вообще движений нет и не было сам дописывал
8 Михаил Козлов
 
09.12.14
12:52
(5) Почему не должен: сколько напишите, столько и спишет.
9 pessok
 
09.12.14
12:53
(5) а причем тут перемещение вообще? заказ поставщику закрывается либо закрытием заказов поставщикам, либо птиу. соответственно в каждой из ситуаций надо получить остаток по сделке и закрыть на него
10 ColonelAp4u
 
09.12.14
12:57
Дело в том что я при открытии формы списка документа обращаюсь к регистру через запрос (заказ может быть исполнен не полностью) и я спрашиваю какие заказы есть вообще у которых КоличествоОстаток > 0
11 Alex S D
 
09.12.14
12:58
(7) Ну если у тебя Перемещение выступает в роли поступления.. то, например в типовой УТ данный регистр уйдет в минус. С чего ты взял что так должно быть? Это ошибка в учете скорее всего
12 ColonelAp4u
 
09.12.14
12:58
и один из вчерашних заказов который был исполнен на половину не отобразился вообще в списке
13 ColonelAp4u
 
09.12.14
12:59
да регистр наверное уходит в минус
14 ColonelAp4u
 
09.12.14
13:01
это база создана для ресторана что бы удобно делать перемещение товаров в магазины. учет не важен должно просто делаться перемещение на основании заказа а потом в УТ это попадает как перемещение на основании Внутреннего заказа
15 Михаил Козлов
 
09.12.14
13:05
(14) Чтобы не было минусов в типовых делается КонтрольОстатков
16 ОбычныйЧеловек
 
09.12.14
13:08
(15) Шикарное решение (как впрочем и любое другое решение от 1С)...
17 ColonelAp4u
 
09.12.14
13:18
(15) у меня из за того что отнимается больше слетел весь регистр все данные попутались
18 ColonelAp4u
 
09.12.14
13:19
(15) как выполнить контроль остатков?
19 ОбычныйЧеловек
 
09.12.14
13:23
(18) Не слушай глупости которые написаны в (15)
Закрывай регистр "заказы поставщикам" по принципу закрытия регистра например "Тавары на складах" и т.д. а не тупо пиши данные в регистр по принципу "что есть в табличной части то и пишу"
20 ColonelAp4u
 
09.12.14
13:25
(19) я извиняюсь программировать только начал и как делается закрытие регистра
21 Михаил Козлов
 
09.12.14
13:25
(19) И какой-же принцип закрытия регистра "Товары на складах", так что минусов не будет?
22 Михаил Козлов
 
09.12.14
13:25
(20) В такой ситуации невредно смотреть, как делается в типовых.
23 ColonelAp4u
 
09.12.14
13:27
Уважаемые давайте е спорить Михаил подскажите как сделать алгоритм что бы не создавать минусы в регистре
24 ColonelAp4u
 
09.12.14
13:28
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказыПоставщикамОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ЗаказыПоставщикам.Остатки КАК ЗаказыПоставщикамОстатки
        |ГДЕ
        |    ЗаказыПоставщикамОстатки.КоличествоОстаток = &КоличествоОстаток";

    Запрос.УстановитьПараметр("КоличествоОстаток", Что тут поставить?);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
    КонецЦикла;
25 ОбычныйЧеловек
 
09.12.14
13:30
Примерно так

тзДвижения=Движения.ЗаказыПоставщикам.ВыгрузитьКолонки();

Запрос=Новый Запрос;
Запрос.УстановитьПараметр("НаДату", МоментВремени()
Запрос.УстановитьПараметр("Номенклатура", Товары.ВыгрузитьКолонку("Номенклатура");
Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", Товары.ВыгрузитьКолонку("ХарактеристикаНоменклатуры"));
Запрос.УстановитьПараметр("Порядок", 10000);

стрУсловие="ЗаказПокупателя В (&Заказ) И Номенклатура В (&Номенклатура)";
Если НЕ МассивХарактеристикиНоменклатуры.Количество()=0 Тогда
    стрУсловие=стрУсловие+" И ХарактеристикаНоменклатуры В (&ХарактеристикаНоменклатуры)";
КонецЕсли;

Запрос.УстановитьПараметр("Заказ", МассивСделок);
Запрос.Текст="
|ВЫБРАТЬ
|    &Порядок,
|    ИсточникДанных1.ДоговорКонтрагента,
|    ИсточникДанных1.ЗаказПокупателя,
|    ИсточникДанных1.Номенклатура,
|    ИсточникДанных1.ХарактеристикаНоменклатуры,
|    СУММА(ИсточникДанных1.КоличествоОстаток) КАК Количество,
|    СУММА(ИсточникДанных1.СуммаОстаток) КАК Сумма
|ИЗ
|    РегистрНакопления.ЗаказыПокупателей.Остатки(&НаДату, "+стрУсловие+") КАК ИсточникДанных1
|
|СГРУППИРОВАТЬ ПО
|    ИсточникДанных1.ДоговорКонтрагента,
|    ИсточникДанных1.ЗаказПокупателя,
|    ИсточникДанных1.Номенклатура,
|    ИсточникДанных1.ХарактеристикаНоменклатуры
|";    
тзНезакрытыеЗаказы=Запрос.Выполнить().Выгрузить();
Для каждого СтрокаКоллекции Из тзНезакрытыеЗаказы Цикл
    ЗаполнитьЗначенияСвойств(СтруктураОтбора, СтрокаКоллекции);
    МассивСтрок=Товары.НайтиСтроки(СтруктураОтбора);
    Для каждого СтрокаМассива Из МассивСтрок Цикл
        Если СтрокаМассива.Количество<=0 Тогда Продолжить; КонецЕсли;
        
        НоваяСтрока=тзДвижения.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКоллекции);
        НоваяСтрока.Количество=Мин(СтрокаКоллекции.Количество, СтрокаМассива.Количество);
        НоваяСтрока.Сумма=СтрокаКоллекции.Сумма*НоваяСтрока.Количество/СтрокаКоллекции.Количество;
        
        СтрокаМассива.Количество=СтрокаМассива.Количество-НоваяСтрока.Количество;                
    КонецЦикла;
КонецЦикла;        
тзДвижения.ЗаполнитьЗначения(Дата, "Период");
тзДвижения.ЗаполнитьЗначения(Истина, "Активность");
тзДвижения.ЗаполнитьЗначения(Ссылка, "Регистратор");
//Движения.ЗаполнитьЗначения(Организация, "Организация");
тзДвижения.ЗаполнитьЗначения(ВидДвиженияНакопления.Расход, "ВидДвижения");
26 Михаил Козлов
 
09.12.14
13:32
(23) Остатки смотреть. Но тут есть такой момент: как правильно контролировать остатки при проведении задним числом.
По-хорошему, нужно контролировать минусы на любое движение по регистру. Часто контролируют на момент проведения, но это может приводить к минусам в дальнейшем. Поэтому в типовых остатки контролируют только при оперативном проведении.
(25) Легко привести пример, когда будут минусы.
27 ОбычныйЧеловек
 
09.12.14
13:34
Процедура ВыполнитьДвиденияРегистра_ЗаказыПоставщикам()
    тзДвижения=Движения.ЗаказыПоставщикам.ВыгрузитьКолонки();
    
    МассивХарактеристикиНоменклатуры=Новый Массив;
    Для Каждого СтрокаКоллекции Из Товары Цикл
        Если НЕ СтрокаКоллекции.ХарактеристикаНоменклатуры.Пустая() Тогда
            МассивХарактеристикиНоменклатуры.Добавить(СтрокаКоллекции.ХарактеристикаНоменклатуры);
        КонецЕсли;
    КонецЦикла;    
    
    Запрос=Новый Запрос;
    Запрос.УстановитьПараметр("НаДату", МоментВремени()
    Запрос.УстановитьПараметр("Номенклатура", Товары.ВыгрузитьКолонку("Номенклатура");
        
    стрУсловие="Номенклатура В (&Номенклатура)";
    Если НЕ МассивХарактеристикиНоменклатуры.Количество()=0 Тогда
        стрУсловие=стрУсловие+" И ХарактеристикаНоменклатуры В (&ХарактеристикаНоменклатуры)";
        Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", МассивХарактеристикиНоменклатуры);
    КонецЕсли;
    
    Запрос.Текст="
    |ВЫБРАТЬ
    |    ИсточникДанных1.ДоговорКонтрагента,
    |    ИсточникДанных1.ЗаказПокупателя,
    |    ИсточникДанных1.Номенклатура,
    |    ИсточникДанных1.ХарактеристикаНоменклатуры,
    |    СУММА(ИсточникДанных1.КоличествоОстаток) КАК Количество,
    |    СУММА(ИсточникДанных1.СуммаОстаток) КАК Сумма
    |ИЗ
    |    РегистрНакопления.ЗаказыПокупателей.Остатки(&НаДату, "+стрУсловие+") КАК ИсточникДанных1
    |
    |СГРУППИРОВАТЬ ПО
    |    ИсточникДанных1.ДоговорКонтрагента,
    |    ИсточникДанных1.ЗаказПокупателя,
    |    ИсточникДанных1.Номенклатура,
    |    ИсточникДанных1.ХарактеристикаНоменклатуры
    |";    
    тзНезакрытыеЗаказы=Запрос.Выполнить().Выгрузить();
    Для каждого СтрокаКоллекции Из тзНезакрытыеЗаказы Цикл
        ЗаполнитьЗначенияСвойств(СтруктураОтбора, СтрокаКоллекции);
        МассивСтрок=Товары.НайтиСтроки(СтруктураОтбора);
        Для каждого СтрокаМассива Из МассивСтрок Цикл
            Если СтрокаМассива.Количество<=0 Тогда Продолжить; КонецЕсли;
            
            НоваяСтрока=тзДвижения.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКоллекции);
            НоваяСтрока.Количество=Мин(СтрокаКоллекции.Количество, СтрокаМассива.Количество);
            НоваяСтрока.Сумма=СтрокаКоллекции.Сумма*НоваяСтрока.Количество/СтрокаКоллекции.Количество;
            
            СтрокаМассива.Количество=СтрокаМассива.Количество-НоваяСтрока.Количество;                
        КонецЦикла;
    КонецЦикла;        
    тзДвижения.ЗаполнитьЗначения(Дата, "Период");
    тзДвижения.ЗаполнитьЗначения(Истина, "Активность");
    тзДвижения.ЗаполнитьЗначения(Ссылка, "Регистратор");
    тзДвижения.ЗаполнитьЗначения(ВидДвиженияНакопления.Расход, "ВидДвижения");
КонецПроцедуры
28 ОбычныйЧеловек
 
09.12.14
13:36
@olonelAp4u Не факт, что у тебя сразу заработает (возможно надо будет чуток напильничком под себя подправить)
29 ОбычныйЧеловек
 
09.12.14
13:37
(26) с удовольствием послушаю (ибо в данном коде система закроет, только столько сколько есть в на остатках (или меньше но никак не больше) )
30 ColonelAp4u
 
09.12.14
13:38
(27) мою процедуру полностью заменить на эту? и доработать ее?
31 ОбычныйЧеловек
 
09.12.14
13:39
(30) просто посмотри принцип...и напиши сам...
32 Михаил Козлов
 
09.12.14
13:40
(27) Представим такую ситуацию:
ПТиУ оприходовало 10.
РТиУ списала 10.
По какой-то причине распровели ПТиУ и в этот момент перепровели РТиУ. В результате РТиУ списала 0. ПТиУ провели.
В документе человек видит 10, а в регистре - 0.
(29) 01.01.2014 поступило 2.
03.01.2014 списали 1.
Оформили РТиУ 02.01.2014 на 2. Контроль пройден, в регистре минус.
Все это уже обсасывалось миллион раз.
33 ОбычныйЧеловек
 
09.12.14
13:43
(32) Я таких примеров тебе миллион приведу и что это меняет? при перепроведении (а его ты сделаешь в любом случае ибо у тебя в таком случае еще и партии полетят) - все восстановится
34 ОбычныйЧеловек
 
09.12.14
13:45
(32) Я вообще не понимаю при чем тут контроль остатков если необходимо просто закрыть заказы, т.е. вместо того, что бы все сделать автоматически ты (как впрочем и 1С) начинает о чем то пользователя предупреждать (мол у тебя где,что-то не так) - пользователю это зачем?
35 Михаил Козлов
 
09.12.14
13:46
(33) Это я к тому, что в типовых часто предлагается продуманное решение и велосипед с квадратными колесами не нужен.
36 ОбычныйЧеловек
 
09.12.14
13:47
(35) Хорошая шутка - я оценил.
37 ColonelAp4u
 
09.12.14
14:08
(35) (36) Подскажите как мне в моем коде (0) когда я записую количество в двжиение Написать что КоличествоРасход <= ЗаказКоличествоПриход, и все что бы больше чем то что в приходе не отнимал что бы это был максимум и при этом давал возможность провести . Я щас тестил на УТ внутренний заказ и на его основании пермещение там если в пермещении на товаре укажу какой внутренний заказ то больше чем стоит приход программа не дает сделать расход пишет не хватает на остатке,
38 ColonelAp4u
 
09.12.14
14:09
Движение.Количество = что тут можно поставить ? ДокументОснование.Товары.Количество не пойдет?
39 ДенисЧ
 
09.12.14
14:12
(38) поставь 42
Тебе всё равно, а людям приятно будет
40 ColonelAp4u
 
09.12.14
14:13
(39) Движение.Количество = 42 для тебя
41 ОбычныйЧеловек
 
09.12.14
14:18
(37) Вот в этом вся 1С...вместо того, что бы списать по заказу (сколько есть) + при наличии товара на складе (без заказа) переместить его на новый склад она тупо скажет пользователю (мол нет по заказу нужного кол-ва, иди правь заказ (пользователю же заняться то все равно нечем))
42 ОбычныйЧеловек
 
09.12.14
14:19
(38) Я же тебе дал практически готовую процедуру...
43 ColonelAp4u
 
09.12.14
14:22
(42) проще че твоя процедура нету варианта?
44 ОбычныйЧеловек
 
09.12.14
14:40
(43) Варианты есть всегда.
45 ColonelAp4u
 
09.12.14
14:58
когда я открываю список документов у меня стоит вот такой запрос
СЗ=Новый СписокЗначений;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказыПоставщикамОстатки.ЗаказПоставщику
        |ИЗ
        |    РегистрНакопления.ЗаказыПоставщикам.Остатки(&НачалоПериода) КАК ЗаказыПоставщикамОстатки
        |ГДЕ
        |    ЗаказыПоставщикамОстатки.КоличествоОстаток > 0";

    Запрос.УстановитьПараметр("НачалоПериода", ТекущаяДата());

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            СЗ.Добавить(ВыборкаДетальныеЗаписи.ЗаказПоставщику);
    КонецЦикла;

    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    
    СтрСсылка=ДокументСписок.Отбор.Найти("Ссылка");
        Если СтрСсылка= Неопределено Тогда
            СтрСсылка=ДокументСписок.Отбор.Добавить("Ссылка");
        КонецЕсли;
    СтрСсылка.ВидСравнения=ВидСравнения.ВСписке;  
    СтрСсылка.Значение=СЗ;
    СтрСсылка.Использование=Истина;
46 ColonelAp4u
 
09.12.14
15:03
(45) и если товар ушел  в регистре в минус и стал < 0 в заказе который отгружен не полностью то этот заказ не попадает в мой СЗ, если поставлю условие <> тогда заказ виден но при его выборе я еще раз обращаюсь к регистру и не добавляю ни одной позиции к пермещению
47 ColonelAp4u
 
09.12.14
15:06
(46) если заказ выполнен если не выполнен увижу ту позицию которую нужно добавить и все равно при полном исполнении заказа он все равно висит в списке
48 ColonelAp4u
 
09.12.14
15:47
У меня в документе перемещения  для сравнения создана Колонка заказано в которую попадает значение количества товара по заказу могу ли я сделать так?
Если ТекСтрокаТовары.Количество< ТекСтрокаТовары.Заказанно Тогда
        Движение.Количество =ТекСтрокаТовары.Количество;
    Иначе
        Движение.Количество =ТекСтрокаТовары.Количество;
        КонецЕсли;
49 ColonelAp4u
 
09.12.14
15:48
упс
Если ТекСтрокаТовары.Количество< ТекСтрокаТовары.Заказанно Тогда
        Движение.Количество =ТекСтрокаТовары.Количество;
    Иначе
        Движение.Количество =ТекСтрокаТовары.Заказанно;
        КонецЕсли;