| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > Можно ли в одной обработке создать 3 таблицы значе |
| Автор: roalang 2.4.2008, 04:16 |
| У меня есть две базы: за 07 и 08 года. Мне надо получить отчет по материалам который пролежал без движения. Т.е. создать отчет, который показывал материалы без движения по двум этим базам. Они разные. Вопрос: можно ли в одной обработке создать 3 ТЗ, 1 для 07 года, 2-ая для 08 года, а в 3-ей сравнить первые две таблицы????? |
| Автор: SaschaL 2.4.2008, 05:17 |
| Да такое возможно! С точки зрения 1С каких либо технических проблем нет! и тем более сравнить Таблицы Значений между собой, самый простой способ это когда все нужные для этого таблицы значений будут приведены к одной структуре и все! |
| Автор: Itsys 2.4.2008, 19:33 |
| Проще выбираешь данные из одной базы - хочешь клади их в ТЗ, хочешь проверяй динамически, подключаемся к другой базе по OLE и проверяем там если сходится - выводим куда надо. |
| Автор: roalang 3.4.2008, 09:18 |
| Itsys скажи как по OLE я не разу с этим не работала??? Знаю только ТЗ. По структуре все таблицы одинаковы.. |
| Автор: SaschaL 3.4.2008, 11:07 | ||
| ТЗ это таблица значений. А через OLE ты должен подключиться к другой базе данных что бы получить аналогичную информацию из другой базы данных. Команды для работы с OLE Automation описываются в главе 40 справочника по встроенному языку. вот пример, взятый с сайта http://www.mista.ru/articles1c/ole.htm, там же еще есть другие примеры, которые показывают работу с OLE Automation:
|
| Автор: roalang 3.4.2008, 11:35 |
| У меня на данный момент вот такая бредовая идея (сроки поджимают наших снабженцев, аж меня вызвали из декретного). Процедура Сформировать() Ит = СоздатьОбъект("БухгалтерскиеИтоги"); // Первая таблица Тз.новаяКолонка("Наименование"); Тз.новаяКолонка("Код"); Тз.новаяколонка("МестаХранения"); Тз.новаяКолонка("Субсчет10"); Тз.новаяколонка("Количество"); Тз.новаяколонка("Снд"); Тз.новаяколонка("Скд"); Ит.ИспользоватьСубконто(ВидыСубконто.Материалы,, 1); Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1); ВыбСчет="10.01;10.02;10.03;10.04;10.05;10.06;10.08;10.09;10.10.01;10.10.02;10.14"; Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, ВыбСчет,,, 1,,); Таб.ВывестиСекцию("Шапка"); Таб.Опции(0,0,Таб.ВысотаТаблицы(),0); Ит.ВыбратьСубконто(ВидыСубконто.Материалы); Пока Ит.ПолучитьСубконто(ВидыСубконто.Материалы) = 1 Цикл кол=ИТ.СКД(3); цена=кол*ИТ.СКД(); если Ит.Скд()=0 тогда продолжить иначе если Ит.Снд()=Ит.СКД() тогда Тз.НоваяСтрока(); Тз.Наименование=Ит.Субконто(ВидыСубконто.материалы).Наименование; Тз.Код=Ит.Субконто(ВидыСубконто.материалы).код; Тз.МестаХранения=Ит.Субконто(2); Тз.Субсчет10=Ит.Субконто(ВидыСубконто.материалы).Субсчет10; Тз.Количество=число(Кол); Тз.Снд=Ит.СНД(); Тз.Скд=Ит.СКД(); конецесли конецесли; КонецЦикла; значениевфайл("C:\остатки.txt", Тз); сообщить("Ура") КонецПроцедуры Процедура сохран() Ит = СоздатьОбъект("БухгалтерскиеИтоги"); // Вторая таблица Тз1.новаяКолонка("Наименование"); Тз1.новаяКолонка("Код"); Тз1.новаяколонка("МестаХранения"); Тз1.новаяКолонка("Субсчет10"); Тз1.новаяколонка("Количество"); Тз1.новаяколонка("Снд"); Тз1.новаяколонка("Скд"); Ит.ИспользоватьСубконто(ВидыСубконто.Материалы,, 1); Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1); ВыбСчет="10.01;10.02;10.03;10.04;10.05;10.06;10.08;10.09;10.10.01;10.10.02;10.14"; Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, ВыбСчет,,, 1,,); Ит.ВыбратьСубконто(ВидыСубконто.Материалы); Пока Ит.ПолучитьСубконто(ВидыСубконто.Материалы) = 1 Цикл кол=ИТ.СКД(3); цена=кол*ИТ.СКД(); если Ит.Скд()=0 тогда продолжить иначе если Ит.Снд()=Ит.СКД() тогда Тз1.НоваяСтрока(); Тз1.Наименование=Ит.Субконто(ВидыСубконто.материалы).Наименование; Тз1.Код=Ит.Субконто(ВидыСубконто.материалы).код; Тз1.МестаХранения=Ит.Субконто(2); Тз1.Субсчет10=Ит.Субконто(ВидыСубконто.материалы).Субсчет10; Тз1.Количество=Кол; Тз1.Снд=Ит.СНД(); Тз1.Скд=Ит.СКД(); конецесли конецесли; КонецЦикла; КонецПроцедуры процедура Выгрузить() Перем Тз3; тз3=создатьобъект("ТаблицаЗначений"); Тз3.новаяКолонка("Наименование"); Тз3.новаяКолонка("Код"); Тз3.новаяколонка("МестаХранения"); Тз3.новаяКолонка("Субсчет10"); Тз3.новаяколонка("Количество"); Тз3.новаяколонка("Снд"); Тз3.новаяколонка("Скд"); ЗначениеИзФайла("C:\остатки.txt",Тз); тз3.новаястрока(); Тз3.Наименование=Тз.Наименование; Тз3.Код=Тз.Код ; Тз3.МестаХранения=Тз.МестаХранения; Тз3.Субсчет10=Тз.Субсчет10; Тз3.Количество=Тз.Количество; Тз3.Снд= Тз.Снд; Тз3.Скд=Тз.Скд; конецпроцедуры Процедура сравнить() перем тз1,тз3; Выгрузить(); сохран(); если тз3.код=тз1.код тогда сообщить("ура"); конецесли; конецпроцедуры знаю, что ерунда |
| Автор: SaschaL 3.4.2008, 12:25 |
| ТАК это все замечательно, но для того чтобы сравнить однотипную информацию с двух одинаковых баз нужно её получить. Допустим создали вы отчет или обработку не важно, создали на форме 3 таблицы значений с разными идентификаторами. Но обработку то вы сможете в одной базе, допустим вы написали алгоритм по получению информации из базы, и поместили эту инфу в ТЗ, но для анализа то вам понадобиться и вторую ТЗ заполнить информацией только уже из другой базы, вот как раз для этого вам и нужно использовать OLE а иначе просто ни чего не получится. Тот вариант что у вас описан с использование файла формата txt в принципе тоже приемлемый вариант если создать вначале обработку по получению информации в одной базе и выгрузить её в другой. Но главное в этом случае не запутаться. Судя по внезапному окончанию кода дальше у вас дело не пошло... В данной ситуации какого рода совет вам нужен? Добавлено через 2 минуты и 7 секунд Если у вас это сделано внешней обработкой можете скинуть на Sascha@74mail.ru я посмотрю может что и посоветую или помогу доработать если конфигурация конечно у вас стандартная. |
| Автор: Itsys 3.4.2008, 13:34 |
| Здесь все не так просто, как кажется. Вопрос зачем тебе такая огромная таблица значений, если при сверке ты используешь только ТЗ.Код - в этом случае проще запихнуть все в СписокЗначений, дальше ты это список сохраняешь ЗначениеВФайл(), в другой конфигурации ты его загружешь из ЗначениеИзФайла, и при проходе итогов проверяешь вхождение нужного кода в список Принадлежит(). Добавлено через 1 минуту и 50 секунд Конфигурация нестандартная в стандартной конфе нет таких счетов учета материалов ЗЫ Если время ждет, то могу сегодня-завра вечером накидать 2 обработки для первой и второй базы, но сейчас времени нет. |
| Автор: roalang 3.4.2008, 17:29 |
| SaschaL : OLE не использовала. Обработку послала. Да, но и предприятие у нас не стандартное..... электростанция. Добавлено через 1 минуту и 8 секунд время ждет, за один день все равно ниче не сделаю..... |
| Автор: SaschaL 3.4.2008, 20:07 |
| Обработку получил, завтра с утра на свежую голову взгляну. И предложу свой вариант |
| Автор: roalang 4.4.2008, 03:07 |
| OK |
| Автор: roalang 4.4.2008, 03:51 |
| как сделать заполнение (инициализация) Тз отдельной функцией |
| Автор: SaschaL 4.4.2008, 09:45 | ||
Вы наверное это имели ввиду:
Вот такой примерно принцип заполнения. Теперь встречный вопрос в обработке которые вы прислали нужно создать третью ТЗ? Я так понимаю что в ней должны попасть только те элементы которых не оказалось в одной из таблиц. |
| Автор: roalang 4.4.2008, 14:48 |
| SaschaL, наооборот как я с коллегой поддумав пришла к выводу если значения в Тз1 и Тз2 равны, то переносить в 3 Тз |
| Автор: Itsys 5.4.2008, 09:16 | ||||
| Ну вот, как обещал, собственно ничего сложного Код для обработки из первой базы:
Теперь для второй, в которой и будет формироваться ТЗ со всеми не используемыми материалами:
И одно замечание: учитесь писать код красиво и понятно. ЗЫ "Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям." (Мартин Фаулер. Рефакторинг) |
| Автор: roalang 5.4.2008, 10:13 |
| Itsys спасибо за тескт обработки. Я давно не программировала, т.к. сижу с ребенком дома, а на работу вызвали по необходимости. |
| Автор: roalang 5.4.2008, 17:26 |
| Itsys правильно ли я тебя поняла??? ты Спис.ДобавитьЗначение(БИ.Субконто(ВидыСубконто.Материалы).Код); добавляешь значение кода в список, сохраняешь это значение. во 2ой процедуре используя БИ сравниваешь вот этой строкой Если Спис.Принадлежит(Ит.Субконто(ВидыСубконто.Материалы).Код) = 1 Тогда значение из списка с кодом, и когда значение равно создаешь ТЗ, где выводишь результат. |
| Автор: Itsys 5.4.2008, 21:50 |
| Да |
| Автор: roalang 7.4.2008, 04:50 |
| чето не получается, оле мне в конечном результате, выводит одни материалы по счету 10.10.02 и все |
| Автор: roalang 7.4.2008, 05:54 |
| В отладчике посмотрела вот эти значания =0 Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения); Пока Ит.ПолучитьСубконто(ВидыСубконто.МестаХранения) = 1 Цикл |
| Автор: Itsys 9.4.2008, 23:45 |
| Ну что получилось? Я проверял на стандартной конфигурации, т.к. у тебя измененная ничего гарантировать не могу. Давай конфигурацию, тогда посмотрю, почему не работает. |